(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