PHP, работающий как приложение FastCGI (php-cgi) - как выпустить параллельные запросы?

Править: Обновление - прокручивает вниз
РЕДАКТИРОВАНИЕ 2: Обновление - проблема решена


Некоторая справочная информация:

Я пишу свой собственный веб-сервер в Java, и несколько дней назад я спросил относительно ПОЭТОМУ, как точно Apache взаимодействует через интерфейс с PHP, таким образом, я могу реализовать поддержку PHP. Я узнал, что FastCGI является лучшим подходом (так как mod_php не является опцией). Таким образом, я посмотрел на спецификацию протокола FastCGI и сумел записать рабочую обертку FastCGI для своего сервера. Я протестировал phpinfo (), и он работает, на самом деле все функции PHP, кажется, работают просто великолепно (регистрация данных, сессий, даты/времени, и т.д. и т.д.).

Мой веб-сервер может служить запросам одновременно (т.е. user1 может получить file1.html в то же время, что и user2, запрашивающий some_large_binary_file.zip), он делает это путем порождения нового потока Java для каждого пользовательского запроса (завершающийся, когда завершено, или пользовательское соединение с клиентом отменяется).

Однако это не может иметь дело с 2 (или больше) запросы FastCGI одновременно. То, что это делает, это ставит их в очередь, поэтому когда запрос 1 завершается сразу после этого, это начинает обрабатывать запрос 2. Я протестировал это с 2 страницами PHP, каждый содержит сон (10) и другой phpinfo ().

Как я пошел бы о контакте с несколькими запросами, поскольку я знаю, что он может быть сделан (PHP при выполнениях IIS как FastCGI, и он может иметь дело с несколькими запросами очень хорошо).

Еще некоторая информация:

Я кодирую под окнами, и мой пакетный файл, используемый для выполнения php-cgi.exe, содержит:

set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000

Но это не порождает 8 детей, сервис просто завершается после 500 запросов.

Я провел исследование и из Википедии:

Обработка нескольких запросов одновременно достигается любой при помощи единственного соединения с внутренним мультиплексированием (т.е. несколько запросов по единственному соединению) и/или при помощи многочисленных связей

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

Я знаю, что внутреннее мультиплексирование запросов FastCGI при том же соединении выполняется путем издания каждого уникального запроса FastCGI с различным идентификатором запроса. (также см. последние 3 абзаца 'Протокола связи', направляющегося в этой статье).

Я не протестировал это, но как я пошел бы о реализации этого? Я беру его, мне нужен некоторый поток FastCGI Java, который содержит какую-то Карту и статическую функцию, которую я могу использовать для добавления запросов к. Затем в выполнении Потока () функционируют, оно имело бы некоторое время цикл, и для каждого цикла оно проверит, содержит ли Карта новые запросы, раз так оно присвоило бы им идентификатор запроса и записало бы им в поток FastCGI. И затем ожидайте входа и т.д. и т.д., Поскольку Вы видите, что это становится слишком сложным.

Кто-либо знает корректный способ сделать это? Или какие-либо мысли вообще?Большое спасибо.

Отметьте, при необходимости я могу предоставить код для своей обертки FastCGI.


Обновление:

В основном я загрузил nginx и настроил его для использования PHP в качестве приложения FastCGI, и он также пострадал от той же проблемы как мой сервер. Это не могло обработать параллельные запросы PHP. Это, приводит меня полагать, что мой код является на самом деле правильным. Таким образом, что-то неправильно с PHP, или я не настраиваю его правильно. Возможно, это - потому что я использую Windows, потому что некоторые lighttpd пользователи утверждают, что Windows не может обработать FastCGI правильно (это не имеет большого смысла). Я установлю Linux когда-то скоро и сообщу о любом прогрессе с этим.

9
задан Jeff Atwood 22 May 2011 в 10:56
поделиться

1 ответ

Хорошо, мне удалось найти причину проблемы. Это был совсем не мой код. Это PHP, он не может создавать дополнительные php-cgi под Windows при работе в режиме FastCGI, под Linux он работает отлично, я просто указал своему серверу IP-адрес своего Linux-бокса, и у него не было проблем с параллельными запросами FCGI. Отстой, но я думаю, что так оно и есть ...

После этого я глубже изучил исходный код PHP и обнаружил, что часть кода, отвечающая на PHP_FCGI_CHILDREN, была инкапсулирована #ifndef WIN32 Так что разработчики должны быть известно о проблеме

9
ответ дан 4 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: