web-dev-qa-db-ja.com

Apacheのタイムアウト/アーキテクチャを理解しようとしています

Apache httpd2.2.15とPHP 5.3.3を実行しているCentOSリリース6.3システムがあります。

私のPHP Webサイトは、タイムアウト制限に達したと思われる1つのクエリを除いて、正常に実行されています。クエリの実行に60秒以上かかり、その結果、ユーザーのブラウザが空白のページを表示する前に、(はるかに長く、約5分以上)待ってください。

Apache/PHPがどのように機能するのか不思議に思いました。

単純なPHPスクリプトテストケースを設定しました。これは、次のことを実行するだけです。

  • 55/65秒間スリープします。
  • 「私はまだここにいます!」を追加します。サーバー上のファイルへ。
  • hTMLの行を出力します。

タイムアウトが55秒の場合、すべてが期待どおりに機能します。ブラウザが55秒間回転してから、HTMLをレンダリングします。

タイムアウトを65秒に設定すると、ブラウザが5分以上回転してから、完全に空白のページが表示されます。一方:

  • 「私はまだここにいます」デバッグ行がサーバー上のファイルに追加され、PHPが正常に実行されたことを示しています。

  • apacheアクセスログは、クエリが実行されたことも示しており、HTTPステータスコード200とHTMLを構成する正しいバイト数を返します。

  • apacheまたはPHPによってログに記録されるエラーはありません。

関連性があると思われるいくつかの構成設定を変更してみました。

  • apache httpd.conf'Timeout 'ディレクティブ、60から120;

  • php.iniの「default_socket_timeout」設定(60から120)。

しかし、テストケースはまったく同じように実行されました。ページが65秒後に戻った後でも、ブラウザが「ハング」します。これは、Firefoxのいくつかのバージョンに当てはまります。

誰かがここで物事がどのように機能しているかを理解するのを手伝ってくれますか?次に、有効なタイムアウト制限を増やして、遅いクエリの実行に60秒以上かかり、結果をブラウザに正常に返すにはどうすればよいですか?

Apacheに制限がある場合(「PHPがクエリを実行するまで60秒以上待たないでください」)、何らかのエラーが返されると予想していました。その60秒後にブラウザが経過するか、その他のエラーをログに記録します。代わりに、PHPが完了するまで実行され、Apacheアクセスログに「ねえ、すべてうまくいきました。送信しました。 75バイトの出力をブラウザに送信します」が、ブラウザ自体はそこにとどまり、その出力を受信しません。何がサイレントに「切断」されているのでしょうか。Apacheがエラーを送信せず、PHP実行を完了するために、なぜ結果を返送しないのですか(アクセスログに表示されるように)?

助けてくれてありがとう。

2
Brad

/etc/php.iniの60秒の値をすべて120に更新してテストします。設定の変更後にApacheを再起動しても、説明どおりに問題が発生する場合は、説明に基づいてphpが原因であると思われます。

1
Schrute