(PECL event >= 1.2.6-beta)
EventBufferEvent::connectHost — 连接到主机名,可选异步 DNS 解析
$dns_base
,$hostname
,$port
,$family
= EventUtil::AF_UNSPEC解析 DNS 名称 hostname,查找类型为 family
( EventUtil::AF_*
常量) 的地址。如果名称解析失败,它将调用事件回调函数,并发出一个错误事件。如果成功,它将启动连接尝试,就像 EventBufferEvent::connect() 一样。
dns_base
是可选的。可以是 null
,或者是用 EventDnsBase::__construct() 创建的对象。对于异步主机名解析,请传递一个有效的事件 DNS 基本资源。否则,主机名解析将阻塞。
注意:
EventDnsBase 仅在
Event
配置了 --with-event-extra (event_extra
库,包括 HTTP、DNS 和 RPC 在内的 libevent 协议特定功能支持) 时可用。
注意:
EventBufferEvent::connectHost() 需要
libevent-2.0.3-alpha
或更高版本。
dns_base
EventDnsBase 的对象,如果 DNS 需要异步解析。否则为 null
。
hostname
要连接到的主机名。识别的格式是
www.example.com (hostname) 1.2.3.4 (ipv4address) ::1 (ipv6address) [::1] ([ipv6address])
port
端口号
family
地址族。EventUtil::AF_UNSPEC
、EventUtil::AF_INET
或 EventUtil::AF_INET6
。参见 EventUtil 常量 。
示例 #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 基站失败\n");
}
$bev = new EventBufferEvent($base, /* 使用内部套接字 */ NULL,
EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
"readcb", /* writecb */ NULL, "eventcb", $base
);
if (!$bev) {
exit("创建缓冲事件套接字失败\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