PHP 8.1.0 RC 2 available for testing

EventBufferEvent::connect

(PECL event >= 1.2.6-beta)

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

Описание

public EventBufferEvent::connect( string $addr ): bool

Подключает файловый дескриптор события буфера к указанному адресу (опционально с портом) или сокету UNIX.

Если сокет не назначен событию буфера, функция выделяет новый сокет и делает его внутренним неблокирующим.

Чтобы разрешить DNS-имена (асинхронно), используйте метод EventBufferEvent::connectHost().

Список параметров

addr

Должен содержать IP-адрес с необязательным номером порта или путь к сокету домена UNIX. Допустимые форматы:

[IPv6Address]:port
[IPv6Address]
IPv6Address
IPv4Address:port
IPv4Address
unix:path
Имейте в виду, что префикс 'unix:' в настоящее время не чувствителен к регистру.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования EventBufferEvent::connect()

<?php
/*
 * 1. Подключение к 127.0.0.1 и порту 80
 * by means of EventBufferEvent::connect().
 *
 * 2. Запрос /index.cphp с помощью HTTP/1.0
 * используя выходной буфер.
 *
 * 3. Асинхронно прочитайте ответ и распечатайте его стандартным выводом.
 */

/* Чтение callback-функции */
function readcb($bev$base) {
    
$input $bev->getInput();

    while ((
$n $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();

echo 
"шаг 1\n";
$bev = new EventBufferEvent($base/* используйте внутренний сокет */ NULL,
    
EventBufferEvent::OPT_CLOSE_ON_FREE EventBufferEvent::OPT_DEFER_CALLBACKS);
if (!
$bev) {
    exit(
"Не удалось создать сокет bufferevent\n");
}

echo 
"шаг 2\n";
$bev->setCallbacks("readcb"/* writecb */ NULL"eventcb"$base);
$bev->enable(Event::READ Event::WRITE);

echo 
"шаг 3\n";
/* Послать запрос */
$output $bev->getOutput();
if (!
$output->add(
    
"GET /index.cphp HTTP/1.0\r\n".
    
"Connection: Close\r\n\r\n"
)) {
    exit(
"Не удалось добавить запрос в выходной буфер\n");
}

/* Подключение к хосту синхронно.
 * Мы знаем IP, и нам не нужно разрешать DNS. */
if (!$bev->connect("127.0.0.1:80")) {
    exit(
"Не удаётся подключиться к хосту\n");
}

/* Отправка ожидающих событий */
$base->dispatch();

Результатом выполнения данного примера будет что-то подобное:

step 1
step 2
step 3
Connected.
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Sat, 09 Mar 2013 10:06:58 GMT
Content-Type: text/html; charset=utf-8
Connection: close
X-Powered-By: PHP/5.4.11--pl2-gentoo

sdfsdfsf
Closing
Done

Пример #2 Подключитесь к сокету домена UNIX, который предположительно обслуживается сервером, прочитайте ответ сервера и выведите его на консоль

<?php
class MyUnixSocketClient {
    private 
$base$bev;

    function 
__construct($base$sock_path) {
        
$this->base $base;
        
$this->bev = new EventBufferEvent($baseNULLEventBufferEvent::OPT_CLOSE_ON_FREE,
            array (
$this"read_cb"), NULL, array ($this"event_cb"));

        if (!
$this->bev->connect("unix:$sock_path")) {
            
trigger_error("Failed to connect to socket `$sock_path'"E_USER_ERROR);
        }

        
$this->bev->enable(Event::READ);
    }

    function 
__destruct() {
        if (
$this->bev) {
            
$this->bev->free();
            
$this->bev NULL;
        }
    }

    function 
dispatch() {
        
$this->base->dispatch();
    }

    function 
read_cb($bev$unused) {
        
$in $bev->input;

        
printf("Получено %ld байтов\n"$in->length);
        
printf("----- данные ----\n");
        
printf("%ld:\t%s\n", (int) $in->length$in->pullup(-1));

        
$this->bev->free();
        
$this->bev NULL;
        
$this->base->exit(NULL);
    }

    function 
event_cb($bev$events$unused) {
        if (
$events EventBufferEvent::ERROR) {
            echo 
"Ошибка bufferevent\n";
        }

        if (
$events & (EventBufferEvent::EOF EventBufferEvent::ERROR)) {
            
$bev->free();
            
$bev NULL;
        } elseif (
$events EventBufferEvent::CONNECTED) {
            
$bev->output->add("test\n");
        }
    }
}

if (
$argc <= 1) {
    exit(
"Путь к сокету не указан\n");
}
$sock_path $argv[1];

$base = new EventBase();
$cl = new MyUnixSocketClient($base$sock_path);
$cl->dispatch();
?>

Результатом выполнения данного примера будет что-то подобное:

Получено 5 байтов
----- данные ----
5:  test

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

  • EventBufferEvent::connectHost() - Подключается по имени хоста с возможностью асинхронного разрешения DNS
add a note add a note

User Contributed Notes

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