PHP Conference Japan 2024

EventBufferEvent::connectHost

(PECL event >= 1.2.6-beta)

EventBufferEvent::connectHost連線至主機名稱,可選擇性使用非同步 DNS 解析

描述

public EventBufferEvent::connectHost(
     EventDnsBase $dns_base,
     string $hostname,
     int $port,
     int $family = EventUtil::AF_UNSPEC
): bool

解析 DNS 名稱 hostname,尋找 family 類型(EventUtil::AF_* 常數)的位址。如果名稱解析失敗,它會使用錯誤事件呼叫事件回呼。如果成功,它會啟動一個連線嘗試,就像 EventBufferEvent::connect() 一樣。

dns_base 是選填的。可能是 null,或使用 EventDnsBase::__construct() 建立的物件。對於非同步主機名稱解析,傳遞有效的事件 DNS 基礎資源。否則,主機名稱解析會被阻塞。

注意:

EventDnsBase 僅在 Event 配置 --with-event-extraevent_extra 函式庫,包括 HTTP、DNS 和 RPC 的 libevent 特定協定功能支援)時可用。

注意:

EventBufferEvent::connectHost() 需要 libevent-2.0.3-alpha 或更新版本。

參數

dns_base

如果 DNS 要非同步解析,則為 EventDnsBase 的物件。否則為 null

hostname

要連線的主機名稱。可辨識的格式為

www.example.com (hostname)
 1.2.3.4 (ipv4address)
 ::1 (ipv6address)
[::1] ([ipv6address])

port

連接埠號碼

family

位址族。EventUtil::AF_UNSPECEventUtil::AF_INETEventUtil::AF_INET6。請參閱 EventUtil 常數

傳回值

成功時傳回 true,失敗時傳回 false

範例

範例 #1 EventBufferEvent::connectHost() 範例

<?php
/* 讀取回呼 */
function readcb($bev, $base) {
//$input = $bev->input; //$bev->getInput();

//$pos = $input->search("TTP");
$pos = $bev->input->search("TTP");

while ((
$n = $bev->input->remove($buf, 1024)) > 0) {
echo
$buf;
}
}

/* 事件回呼 */
function eventcb($bev, $events, $base) {
if (
$events & EventBufferEvent::CONNECTED) {
echo
"已連線。\n";
} elseif (
$events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
if (
$events & EventBufferEvent::ERROR) {
echo
"DNS 錯誤: ", $bev->getDnsErrorString(), PHP_EOL;
}

echo
"關閉中\n";
$base->exit();
exit(
"完成\n");
}
}

$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // 我們將使用非同步 DNS 解析
if (!$dns_base) {
exit(
"初始化 DNS Base 失敗\n");
}

$bev = new EventBufferEvent($base, /* 使用內部 socket */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb", $base
);
if (!
$bev) {
exit(
"建立 bufferevent socket 失敗\n");
}

//$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

$output = $bev->output; //$bev->getOutput();
if (!$output->add(
"GET {$argv[2]} HTTP/1.0\r\n".
"Host: {$argv[1]}\r\n".
"Connection: Close\r\n\r\n"
)) {
exit(
"將請求新增到輸出緩衝區失敗\n");
}

if (!
$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
exit(
"無法連線到主機 {$argv[1]}\n");
}

$base->dispatch();
?>

上面的範例將輸出類似以下的內容

Connected.
HTTP/1.0 301 Moved Permanently
Location: http://www.google.co.uk/
Content-Type: text/html; charset=UTF-8
Date: Sat, 09 Mar 2013 12:21:19 GMT
Expires: Mon, 08 Apr 2013 12:21:19 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.co.uk/">here</A>.
</BODY></HTML>
Closing
Done

參見

新增註解

使用者提供的註解

此頁面尚無使用者提供的註解。
To Top