Intereting Posts
Как загружать изображения на Php-сервер и хранить в phpmyadmin Как продлить срок действия токена с момента отмены офлайн_access Ссылка: что такое переменная область, какие переменные доступны из того, где и какие ошибки «неопределенной переменной»? Нет заголовка «Access-Control-Allow-Origin» Как я могу использовать значение переменной как константу? APNS: недействительный токен (8) Ошибка CodeIgniter 2.1 с show_404 () и 404_override Правильный способ использования функции «Запомнить меня» в PHP Обновление Ajax на div с идентификатором Как получить идентификатор увеличения отправления по идентификатору заказа в Magento wordpress: идентификатор категории и идентификатор сообщения не получаются, когда я изменяю постоянную ссылку ajax POST в ajax успешно не делает ничего Как эффективно находить ближайшие места поблизости от данного места PHP получает выбранные строки таблицы из флажков Сделайте акцию после входа в систему

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

EDIT: обновление – прокрутка вниз
EDIT 2: Обновление – проблема решена


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

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

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

Тем не менее, он не может обрабатывать 2 (или более) запросов FastCGI одновременно. Что он делает, он их ставит в очередь, поэтому, когда запрос 1 завершается сразу после этого, он начинает обработку запроса 2. Я протестировал это с помощью двух страниц PHP, один из которых содержит sleep (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, который содержит какую-то карту и статическую функцию, которую я могу использовать для добавления запросов. Затем в функции Run () Thread будет иметь цикл while, и для каждого цикла он будет проверять, содержит ли Map новые запросы, если это так, что он назначит им идентификатор запроса и напишет их в поток FastCGI. А затем подождите ввода и т. Д., Так как вы можете видеть, что это становится слишком сложным.

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

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


Обновление :

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

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

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

Привет, это немного поздно, я написал создателя php-cgi.exe на окнах, но не идеально, но это может быть то, что вам нужно. Проверьте это здесь .

re: скрипт spwn-php python …

Спасибо @nosam, который действительно помог.
Для тех, кто хочет быстро работать, вам понадобится следующая (если 64-битная система)

ActivePython-2.7.2.5-win64-x64.msi
pywin32-217.win-amd64-py2.7.exe

ActivePython не имеет более старых версий этих на своем www, поэтому вам нужно немного поработать над поиском рабочего зеркала (там много)

После того, как вы загрузили src из bitbucket, вам может потребоваться отредактировать spawn-php.py (чтобы исправить промежуток между вкладками), поскольку бит-ведро, казалось, испортило вкладку в файле, чтобы она не запускалась.

Все-в-одном, что спасло мой день за занятый маленький сайт с помощью nginx + fast-cgi.

Спасибо друг!