15

VMWare内のLinuxでApacheを実行しています。

私がリクエストしている PHP ページの 1 つは を実行します。最初のページが であるときに 2sleep()番目のページをリクエストしようとするとsleep()'ing、2 番目のページがハングsleep()し、最初のページの が終了するのを待ちます。

他の誰かがこの動作を見たことがありますか?

PHPマルチスレッド化されていないことは知っていますが、これは CPU の扱いが間違っているようです。

編集:CPU使用率が急上昇しないことを言及する必要がありました。CPU の「ホギング」とは、ページが sleep() している間、他の PHP ページが CPU を使用できないように見えることです。

4

3 に答える 3

11

呼び出されたページがセッションを開き、それをコミットしない可能性があります。この場合、解決策についてはこの回答を参照してください。

于 2009-01-31T11:28:58.803 に答える
4

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

したがって:

1 つの子プロセスがリクエストを処理しているため (この場合はスリープ状態ですが、実際の作業を行っている可能性があります。Apache は違いを認識できません)、新しいリクエストが来ると、最初のプロセスが完了するまで待機する必要があります。

解決策は、Apache が生成できる子プロセスの数を増やし ( prefork MPM を使用している場合はMaxClientsディレクティブ)、単純に PHP スクリプトから sleep() を削除することです。

スクリプトで何が起こっているかを正確に把握していないと、なんとも言えませんが、おそらく sleep() を取り除くことができます。

于 2008-08-22T14:01:07.120 に答える
1

実際に CPU が 100% になっているのを見ていますか、それとも他のページが提供されていないだけですか? いくつの Apache インスタンスを実行していますか? のスレッドで sleep() を実行すると、それらはすべて停止しますか?

PHP の sleep() 関数は、基本的に n 秒間アイドル ループを実行します。メモリは解放されませんが、CPU 負荷が大幅に増加することはありません。

于 2008-08-21T23:20:26.160 に答える