2008-08-21 8 views
15

私はLinux上でLinux上でApacheを実行しています。sleep()サイレントホッグCPU

私は要求していますPHPのページの一つがsleep()を行い、そして私は私が最初のページながら、2番目のページを要求しようとした場合に、最初のページからsleep()を待って、2ページ目がハングsleep()'ingであることを見つけます終わり。

誰でもこの動作を確認していますか?

私はPHPマルチスレッドではありませんが、これはCPUの総取扱いミスのように思えることを知っています。

を編集してください:CPU使用率が急上昇しないことを述べておきます。私がCPUを「ホッギングする」とは、ページがスリープしている間に他のPHPページがCPUを使用できないように見えるということです。

+0

解決方法を見つけましたか?私は同じ問題を抱えています。 –

答えて

1

実際にCPUが100%になっているのを見ているのですか、それとも他のページが供給されていないのですか?いくつのapache-instancesを実行していますか?スレッドの中であなたが眠っているとき、彼らはすべて止まっていますか?

PHPのsleep()関数は、本質的にn秒間アイドルループを実行します。メモリを解放するわけではありませんが、CPUの負荷を大幅に増やしてはいけません。

4

これはおそらく、Apacheが1つの子プロセスしか使用していないことを意味します。したがって

:1つのプロセスがリクエストを処理している

(眠っているこの場合には、それは本当の仕事をしていることができ、Apacheは違いを見分けることはできません)、新しい要求は、それが来るときに、それがされます最初の処理が完了するまで待つ必要があります。

解決策は、Apacheが起動することが許可されている子プロセスの数を増やすことです(プリフォークMPMを使用している場合はMaxClientsディレクティブ)。PHPスクリプトからsleep()を削除するだけです。

)を正確にあなたのスクリプトで何が起こっているのかを知ることがなければ、言うのは難しいですが、あなたはおそらく(睡眠を取り除くことができます。

+0

あなたは「おそらく」という言葉で少し考えたことがありますが、今まで見たことのないビットを削除することができないと考えているのはまだ分かりません。 – JoeBloggs

+3

申し訳ありませんが、私の発言はより明確には言いませんでした。 私はあなたがちょうど睡眠を取り除くことができたとは言えませんでした。私は、おそらくsleep()が正当な理由でそこにないことを意味し、sleep()を使わないで動作するようにアプリケーションを書き直すことができました。 – rix0rrr

10

それはというページがセッションをオープンし、それをコミットしていない、この場合には解決策のためのthis answerを見ているかもしれません。

+4

session.auto_startを1に設定してphp.iniを設定している場合は、コードを実行する前にセッションを開き、明示的に閉じるかページが終了するまで開いたままにします。 2番目のリクエストは、コードの最初の行が実行される前でも一見ハングします。 –

+2

私の場合、ループを開始する前に 'session_write_close()'を呼び出すと、 'sleep'はサーバ上の他のページへのアクセスをロックしませんでした。 – thirdender