1

IIS 7.5 で実行されている php アプリケーション、php 5.4 が fastcgi として実行されています。アプリケーションは、長時間実行されている php スクリプトがハングしているように見えることを除いて、まったく問題なく動作します。500 エラーはなく、完了していないように見え、ブラウザに結果が返されます。

メイン アプリでプログラミング エラーが発生する可能性を排除するために、以下に簡単なテスト スクリプトを作成しました。

<?php
/* test timeout */
/*set_time_limit(110);*/
echo "Testing time out in seconds\n";
for ($i = 0; $i < 175; $i++) {
    echo $i." -- ";

    if(sleep(1)!=0)
    {
        echo "sleep failed script terminating"; 
        break;
    }
}

?>

175 秒を超えてスクリプトを実行すると、ハングします。その下では、ブラウザに結果が返されます。

以下は、php と fastcgi に設定したタイムアウト パラメータです。また、さまざまなタイムアウトエラーを発生させるためにこれらを非常に低く設定して遊んでみましたが、成功したため、欠落している別の設定があるという結論に達しました..おそらく.

私の推測が間違っている場合は訂正してください。ただし、スクリプトがタイムアウトした場合、スクリプトが完了前に IIS によって強制終了されたかのように、ブラウザに何も返されず、何を取得するかのように、ブラウザでエラーが発生すると言っても過言ではありません。ブラウザに関する限り、ハングしているように見えますか?

fastcgi

activity timeout=800 Idle Timeout = 900 request Timeout 800

Php

max_execution_time=700
4

1 に答える 1

1

長時間実行されているスクリプトがブラウザと通信しない場合、180 秒ほど経過すると、ほとんどのブラウザは結果を返すサーバーに応答しなくなります。サーバー スクリプトがハングしたり終了したりしたのではなく、ブラウザー (つまり、ff と chrome) が応答しなくなったのです。

これを確認するために、スクリプトを実行してリクエストのステータスを確認しました。IIS マネージャー -> サーバーを選択 -> ワーカー プロセスを選択 (中央ペイン) -> アプリケーション プールを選択 -> ビュー要求 (右側のペイン) を選択し、ステータスと経過時間の列を監視しました。値が更新されていることを確認するには、[すべて表示] を繰り返しクリックする必要があります。

状態が ExecuterequestHandler から Sending response に変わり、スクリプトは正常に終了しましたが、ブラウザはサーバーの応答を待っているように見えました。

上記のテスト スクリプトを次のように更新して、ブラウザーに定期的に応答が供給されるようにしました。

<?php 
@ini_set("output_buffering", "Off");
@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('max_execution_time', 800);


header( 'Content-type: text/html; charset=utf-8' );


echo "Testing time out in seconds\n";
for ($i = 0; $i < 600; $i++) {
    echo $i." -- ";

    if(sleep(1)!=0)
    {
        echo "sleep failed script terminating"; 
        break;
    }
    flush();
    ob_flush();
}

?>

出力がブラウザのビットバイビットに返されず、問題が残りました。

次のステップでは、サーバーでの応答のバッファリングについて調べました。設定が非常に高い数値に設定されていたため、フラッシュが機能しませんでした。そこで、 PHP フラッシュで@Dario によって提供された指示に従って、ResponseBufferLimit を 0 に設定し、IIS7.5 でのフラッシュを停止しました。

これで問題は解決しました:)この解決策が役に立った場合は、上記の質問にアクセスして、ダリオに私からさらに+1を与えてください。おそらく、彼の質問とスクリプトのOPに1つ与えてください。

ありがとう

于 2012-12-01T11:32:17.327 に答える