Соединения сокетов только один поток? - PullRequest
2 голосов
/ 16 марта 2012

Как я понимаю, Apache не подходит для обслуживания запросов с длинным опросом, поскольку каждый запрос в Apache будет использовать один рабочий поток, пока запрос не завершится, что может занять длительное время для запросов с длинным опросом / COMET.

А как насчет сокетных соединений? На веб-сайте PHP я увидел пример «простого мультиклиентского сервера, написанного на PHP, который действительно работает» .

Мой вопрос: такие серверы сокетов используют только один рабочий поток для всех установленных соединений? А как же наоборот: возможно ли написать клиент PHP, который подключается к нескольким серверам сокетов одновременно, используя только один рабочий поток?

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Это пример сервера в стиле цикла опроса - смотрите, как константа MSG_DONTWAIT передается в socket_recv()? По сути, он имеет один поток, который проходит через все свои открытые сокеты, чтобы увидеть, есть ли у какого-либо из них ожидающие данные. Если сокет не ожидает данных, он переходит к следующему и проверяет его.

Тем не менее, обратите внимание, что на таком сервере вы не сможете получить хорошую обработку протоколов за пределами базы TCP - вам придется самостоятельно разбирать поток необработанных данных.

3 голосов
/ 16 марта 2012

Все ваши соединения выполняются с помощью сокетов. Основное различие заключается в том, блокирует ли ввод / вывод или нет. Выбор получения из сокета, который блокирует, приведет к блокировке потока, но использование MSG_DONTWAIT завершится немедленно.

Apache дает вам несколько вариантов в этом отношении. Вы можете разветвляться для одновременных соединений (mpm-prefork), использовать разные потоки для каждого соединения (mpm-worker) или потоки с неблокирующим вводом / выводом (mpm-событие).

3 голосов
/ 16 марта 2012

Посмотрите на phpDaemon . Это дизайн для приложений с длинным пулом и тому подобное. Но я советую вам использовать node.js для этих задач, если это возможно.

...