PHP 8.6.0 Beta 1 is available for testing

EventHttp::accept

(PECL event >= 1.2.6-beta)

EventHttp::acceptЗаставляет HTTP-сервер принимать соединения на заданном потоке сокета или ресурса

Описание

public function EventHttp::accept( mixed $socket ): bool

Заставляет 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

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

  • EventHttp::bind() - Привязывает HTTP-сервер к указанному адресу и порту

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы

AltStyle によって変換されたページ (->オリジナル) /