6

私の一生の間、私はこれを理解することができません。

これは私の開発マシンのセットアップです:

Windows 7 Home Premium 64ビット、
Webサーバー:NGINX 1.3.6 c:\ users \ user_name \ devel \ nginx
PHP:5.4.7 c:\ users \ user_name \ devel \ nginx \ php5

正確に500ヒットした後、私のphp-cgi.exeが予期せず終了することを除いて、すべてが正常に機能します。エラーログ、イベント、何もありません。500ヒット後に死ぬだけです...毎回。私はこれについて私を助けるためにオンラインで単一の情報源を見つけませんでした。すべての構成は有効で適切なようです。これは、2つの異なるマシン(開発用デスクトップとノートブック)で発生しています。さまざまなnginx.confファイルとphp.iniファイルを試しました...それでも同じです。

これをデバッグする方法について、より良いアイデアを得る必要があります。助言がありますか?

4

4 に答える 4

15

私はついにそれを理解しました。解決策が見つからないほど単純だったのかもしれません。

追加:

SET PHP_FCGI_MAX_REQUESTS=0 

php-cgi.exeを起動するコマンドファイルに修正しました。FCGIが殺される前に、デフォルトで(設定されていない場合)500ヒットになると思います。

明らかに、これには正当な理由があり、GargantuChet が示唆しているように、物事を正しく設定し、PHP のインスタンスを管理して自動生成する方が良い方法です...しかし、迅速な Windows 開発環境が必要な人にとっては、これはいくつかの問題を解決できます。

于 2012-10-22T22:01:31.667 に答える
6

選択した回答は機能しますが、CGI サーバーを頻繁にシャットダウンすることはできません (OP の場合は 500 ヒット後)。

OPや他の人が言及したように、このシャットダウンは、本番環境でメモリリークを削減するために必要です。

Windows では、別の解決策として、次のようなバッチ ファイルを作成します。

:start
    php-cgi -b 127.0.0.1:9000
    goto start

これにより、発生するように設計されたシャットダウンが許可され、すぐに php-cgi が再び開始されます。

于 2015-12-24T22:19:26.540 に答える
1

独自のコマンドライン パラメータを渡して php-cgi.exe をループ実行する非表示の 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;
}

そして、「php-cgi.exe -b 127.0.0.1:9000」の代わりに「phpCgiExeLoop -b 127.0.0.1:9000」を実行します... php 作成者の意図を勝ち取ります (メモリリークの可能性を回避します)。

于 2012-10-30T21:57:31.413 に答える