(PECL event >= 1.2.6-beta)
EventHttp::accept — Заставляет HTTP-сервер принимать соединения на заданном потоке сокета или ресурса
Заставляет HTTP-сервер принимать соединения на заданном потоке сокета или ресурса. Потребуется подготовить сокет к приёму соединений.
Метод вызвают несколько раз, чтобы принимать соединения на разных сокетах.
Замечание:
Метод EventHttp::bind() привязывает сокет, переводит сокет в режим
listen
для ожидания соединений и принимает соединения на сокете через системный вызовaccept
в одном вызове. Метод EventHttp::accept() вызывают, только если сокет уже готов принимать соединения.
socket
Ресурс сокета, потоковый или числовой дескриптор файла, которые представляют сокет, готовый принимать соединения.
Функция возвращает true
, если выполнилась успешно, или false
, если возникла ошибка.
Пример #1 Пример работы метода EventHttp::accept()
<?php
$base = new EventBase();
$http = new EventHttp($base);
$addresses = [
8091 => "127.0.0.1",
8092 => "127.0.0.2",
];
$i = 0;
$socket = array();
foreach ($addresses as $port => $ip) {
echo $ip, " ", $port, PHP_EOL;
$socket[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_bind($socket[$i], $ip, $port)) {
exit("ошибка socket_bind\n");
}
socket_listen($socket[$i], 0);
socket_set_nonblock($socket[$i]);
if (!$http->accept($socket[$i])) {
echo "Принять не удалось\n";
exit(1);
}
++$i;
}
$http->setCallback("/some-page", function () {
echo "(some-page)\n";
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});
$http->setDefaultCallback(function ($req) {
echo "URI: ", $req->getUri(), PHP_EOL;
$req->sendReply(200, "OK");
echo "OK\n";
});
$signal = Event::signal($base, SIGINT, function () use ($base) {
echo "Пойман SIGINT. Останавливаем...\n";
$base->stop();
});
$signal->add();
$base->dispatch();
echo "конец\n";
// Мы не закрывали сокеты, так как Libevent
// уже установил флаги CLOSE_ON_FREE и CLOSE_ON_EXEC
// в дескрипторе файла, связанном с сокетами.
?>
Вывод приведённого примера будет похож на:
Client: $ nc 127.0.0.1 8091 GET /about HTTP/1.0 Connection: close HTTP/1.0 200 OK Content-Type: text/html; charset=ISO-8859-1 Connection: close Server: 127.0.0.1 8091 127.0.0.2 8092 URI: /about OK