(PECL event >= 1.2.6-beta)
EventBufferEvent::connectHost — Соединяется с хостом по имени с необязательным асинхронным разрешением DNS-имени
$dns_base
,$hostname
,$port
,$family
= EventUtil::AF_UNSPEC
Метод разрешает DNS-имя хоста путём поиска адресов, тип которых указали в параметре family
константой семейства EventUtil::AF_*
. При ошибке разрешения
имени метод вызывает callback-функцию события с событием ошибки.
Метод, если завершается успешно, запускает попытку подключения так же,
как это сделал бы метод EventBufferEvent::connect().
Параметр dns_base
необязателен и принимает
значение null
или ссылается на объект, который создали методом
EventDnsBase::__construct(). Для асинхронного
разрешения имени хоста потребуется передать действительный базовый ресурс
DNS-события, иначе разрешение имени хоста заблокируется.
Замечание:
Класс EventDnsBase доступен, только если модуль
Event
сконфигурировали с параметром --with-event-extra (библиотекаevent_extra
, поддержка функций протокола libevent, включая протокол HTTP, систему DNS и проткол RPC).
Замечание:
Методу 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.
Функция возвращает true
, если выполнилась успешно, или false
, если возникла ошибка.
Пример #1 Пример работы метода EventBufferEvent::connectHost()
<?php
/* Callback-функция чтения */
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;
}
}
/* Callback-функция события */
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("Не удалось создать сокет bufferevent\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