Для жизни я не могу понять это.
Это моя разработка машины:
Windows 7 Home Premium 64 бит,
Веб-сервер: NGINX 1.3.6 c: \ users \ имя_пользователя \ devel \ nginx
PHP: 5.4.7 c: \ users \ имя_пользователя \ devel \ nginx \ php5
Все работает отлично, за исключением того, что после ровно 500 хитов мой php-cgi.exe неожиданно завершает работу. Нет журналов ошибок, никаких событий, ничего. Он просто умирает после 500 ударов … КАЖДОЕ ВРЕМЯ. Я не нашел ни одного источника информации в Интернете, чтобы помочь мне в этом. Вся конфигурация кажется действительной и хорошей. Это происходит на двух разных машинах (мой рабочий стол для разработки и мой ноутбук). Я пробовал разные файлы nginx.conf и php.ini … все тот же.
Мне просто нужно лучше понять, как отлаживать это. Какие-либо предложения?
Я наконец-то понял. Возможно, это было достаточно просто, что я не мог найти решение.
Добавление:
SET PHP_FCGI_MAX_REQUESTS=0
в командный файл, запускающий php-cgi.exe, исправил его. Я предполагаю, что он по умолчанию (если не установлен) до 500 ударов, прежде чем FCGI будет убит.
Очевидно, что для этого есть веские причины, и, как предложил GargantuChet, правильные настройки и разрешение экземпляров PHP-управления и автоматического запуска – лучший способ пойти … но для людей, которые хотят создать среду разработки Windows, это может решить некоторые проблемы.
Выбранный ответ работает, но не позволяет серверу CGI закрываться так часто (после 500 ударов в случае OPs).
Как и OP и другие упомянутые, это остановка необходима в производственной среде для ограничения утечек памяти.
В Windows другое решение – создать пакетный файл, который выглядит так:
:start php-cgi -b 127.0.0.1:9000 goto start
Это позволит завершить работу, которая должна была произойти, и почти сразу запустит php-cgi.
unvisible EXE-файл, который будет LOOP-RUN php-cgi.exe с передачей его собственных параметров командной строки, может быть легко скомпилирован, например, в ms-VCpp6 ( phpCgiExeLoop.exe ~ 28kb):
#include <windows.h> #include <Shellapi.h> #include "stdio.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { while (1) { SHELLEXECUTEINFO shExInfo = {0}; shExInfo.cbSize = sizeof(shExInfo); shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS; shExInfo.hwnd = 0; shExInfo.lpVerb = "open"; // Operation to perform shExInfo.lpFile = "php-cgi.exe"; // Application to start shExInfo.lpParameters = lpCmdLine; // Additional parameters shExInfo.lpDirectory = 0; shExInfo.nShow = SW_HIDE; shExInfo.hInstApp = 0; if (ShellExecuteEx(&shExInfo)) { WaitForSingleObject(shExInfo.hProcess, INFINITE); CloseHandle(shExInfo.hProcess); } } return 0; }
и запускать «phpCgiExeLoop -b 127.0.0.1:9000» вместо «php-cgi.exe -b 127.0.0.1:9000» … для поддержки поддержки php-разработчиков (избегая возможных утечек памяти).