2

作成中の PHP アプリケーションで非常に奇妙な問題が発生しています。

開発サーバー (Windows 7 64 ビット)sometestsite.comendpoint.sometestsite.com.

私のhostsファイルでは、sometestsite.comendpoint.sometestsite.comを指すように構成しました127.0.0.1

サーバーがPHP 5.4.9をfcgiモジュールとして使用してApache 2.4.2を実行していた場合、すべてが機能します。

次に、Apache を削除し、nginx-1.2.5 (Windows ビルド) をインストールしました。php-cgi.exe をサービスとして実行しましたが、すべて正常に動作しているようです。

sometestsite.com問題は、以前は機能していた からへの CURL 呼び出しendpoint.sometestsite.comがタイムアウトになることです。

次に、そのコードの一部を、テスト用に小さな PHP ファイルに移動しました。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://endpoint.sometestsite.com/test');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('provider' => urlencode('provider'),
'key' => urlencode('asdf')));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//Execute and get the data back
$result = curl_exec($ch);

var_dump($result);

これは、PHP ログで受け取るものです。

PHP Fatal error:  Maximum execution time of 30 seconds exceeded in D:\www\test5.php on line 22
PHP Stack trace:
PHP   1. {main}() D:\www\test5.php:0

ただし、CLI CURL (Git Bash 経由) を使用して同じ要求を実行すると、正常に動作します。

$ curl -X POST 'http://endpoint.sometestsite.com/test' -d'provider=provider&key=asdf'
{"test": "OK"}

PHP は Apache を使用したときとまったく同じバージョンであり、構成も同じであるため、これは非常に奇妙です。

これが Web サーバーの構成の問題なのか、PHP の CURL の問題なのかはまだわかりません。

なぜこれが起こっているのかについて、誰かが洞察/過去の経験を提供できますか?

4

2 に答える 2

1

Nginx は php-cgi.exe プロセスを生成しません。私のようにApacheから来てmod_fcgidを使用した場合、システムに多くのphp-cgi.exeプロセスがあることがわかります。

Nginx は PHP プロセスを生成しないため、自分でプロセスを開始する必要があります。私の場合、php-cgi.exe -b 127.0.0.1:9000サービスとして自動的に実行しています。次に、Nginx は PHP のすべてのリクエストを PHP ハンドラにプッシュし、レスポンスを受け取ります。

問題: PHP-FPM が Windows で動作しません(5.4.9 以降)。FPM は、バックグラウンドで動作し、リクエストの処理時に PHP プロセスの生成と終了を管理する、きちんとした小さなプロセス マネージャーです。

これは不可能であるため、Windows では、ここで経験した問題と同様に、一度に 1 つのリクエストしか処理できません。

私の場合、次のことが起こります: アプリケーションで on を呼び出すページを呼び出しsometestsite.comます。内部では、CURL リクエストが 上のページを呼び出します。ただし、この 2 番目の要求を処理するための新しい PHP プロセスを生成することはできません。元の php-cgi.exe は、CURL リクエストを実行しているリクエストを処理することによってブロックされます。そのため、デッドロックが発生し、すべてがタイムアウトします。php-cgi.exe127.0.0.1:9000endpoint.sometestsite.com

私が使用した解決策 (ほとんどハックです) は、このpython スクリプトを使用して10 個の PHP プロセスを生成することです。

次に、nginx でアップストリーム ブロックを使用して (スクリプトのドキュメントに従って)、10 個のプロセスが利用可能であることを nginx に伝えます。

その後、物事は完全に機能しました。

そうは言っても、これを本番環境で使用しないでください (とにかく Linux で nginx と php-fpm を実行する方がよいでしょう)。ビジーなサイトの場合、10 プロセスでは不十分な場合があります。ただし、必要なプロセスの数を知るのは難しい場合があります。

ただし、Windows で php を使用して nginx を実行する必要がある場合は、このチュートリアルに従って、Cygwin 内で PHP-FPM を実行することを検討してください。

于 2012-12-11T06:09:24.410 に答える