PHP 8.1.0 RC 2 available for testing

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-имени, ища адреса типа 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($buf1024)) > 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($baseTRUE); // Использование асинхронного разрешения 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], 80EventUtil::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

Смотрите также

  • EventBufferEvent::connect() - Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top