2

私は http サーバーと php として apache を使用しています。ブラウザからこの php スクリプトに約 5 つの同時リクエストを送信しました。これには for ループがあり、完了するまでに時間がかかります。すべての同時リクエストがブロックされ、順次処理されることがわかりました。

シーケンシャル サービング動作ではなく、http リクエスト サービングのノンブロッキング動作のために apache または php を設定するにはどうすればよいですか?

    I know that Tomcat server http connector can tune using following server parameters

    – Threads (maxThreads)
    – Keep alive requests (maxKeepAliveRequests)
    – TCP Backlog (acceptCount)
    – connectionTimeout
    – Socket buffers
    - Use different connectors (nio, apr, bio)

etc...

5 つの同時リクエストに対してテストされたが、Web サーバーによって順次処理される php コード スニペット (Apache 2.2、php 5.3)

<?php
for ($i = 1; $i < 500000; $i++) { //do some processing which takes some time
    $sq = sqrt($i); 
    $val += $sq;
}
echo $val;
?>
4

3 に答える 3

5

同様の問題に遭遇し、Apache と PHP が正しく構成されていることを発見しましたが、PHP スクリプトが特定のリソースでブロックされていました。私の場合、ロックされていたのはセッション ファイルであり、セッション ファイルが再び解放されて新しい要求を処理できるようになる前に、各要求が完了する必要がありました。(この問題について詳しく説明している記事は次のとおりです: http://konrness.com/php5/how-to-prevent-blocking-php-requests/ ) セッションがブロックされないようにすると、並列処理が見られるようになりました。期待するでしょう。

于 2012-08-07T12:41:15.800 に答える
2

apache.conf で次のディレクティブを使用します。

StartServers          3
MinSpareServers       5
MaxSpareServers       7

同時接続が即座に処理されるのを待っている追加のプロセスを生成します。必要に応じて数値を調整します。

于 2012-07-31T12:09:01.843 に答える
1

PHPスクリプトでforループを使用して、このセットアップでリクエストをテストしました

HTTP 経由でコンテンツのシーケンシャル リクエストを行うスクリプトを作成し、それらがシーケンシャルに提供されていることを発見しましたか?

コードを表示していません。イベントベースのソケット クライアントを 1 つのスレッドで実装することは可能ですが、これをコーディングするのはかなり困難です。これが事実であったとしても、(チャンクがない場合) 各メッセージが完全な要求になるという理由だけで、コンテンツが順次処理されていないように見えたら、私はまだ驚くでしょう.

すべての同時リクエストがブロックされているのを見ました

ミューテックスが存在する場所はたくさんあります。コードにさらにミューテックスを導入し始める前であっても、php セッションごと、ssl セッションごとのミューテックスは明らかな候補です。

これがどのバージョンの Apache であるか、さらに重要なことに、どの mpm エンジンが使用されているか、どのように構成されているか、どのオペレーティング システムで実行されているかについて言及していないことから、テストはおそらくそれほどではなかったと思います。洗練された。

あなたの結論は、ウェブサーバーの基本的な要件、つまり複数のクライアントを同時に処理できることを明示的に否定しています。

http 要求処理の非ブロッキング動作のために apache または php を構成する方法

テスト/分析に欠陥があるという入手可能な証拠に基づいて、すでにこれを行っています。

于 2012-07-31T12:47:51.307 に答える