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

# 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-сервер к указанному адресу и порту

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open