2016-05-25 53 views
6

私はAMPPSをインストールしています。なぜ、Apacheは複数のリクエストを同時に処理できないのですか?

私のApacheサーバーは複数のPHPリクエストを同時に処理できません(例えば、localhost/script.phpを複数回呼び出すと、それらは連続した順序で処理されます)。 script.php<?php sleep(10); ?>のみで構成されています。

私は、MaxClients指示が同時アクセス構成を担当していますが、それは私のhttpd.confには全くありません。

Xdebugを無効にして、スクリプトの先頭にsession_write_close();を書き込むことができませんでした。私は、ファイルの先頭と私のコードにsession_start();を追加

は、ように見えた:

<?php 

session_start(); 
session_write_close(); 
sleep(10); 
phpinfo(); 

echo "Done"; 

localhost/script.phpに5つの要求を行う場合は、最後の4が終了する最初のを待って、その後に同時に終了。

問題を解決してください。この問題を解決するために必要な情報がない場合は、通知して追加します。

+0

これを試してください:http://stackoverflow.com/questions/3389496/how-do-you-increase-the-max-number-of-concurrent-connections-in-apache – ExtremsX

+0

'session_write_close()'はセッションを防ぐべきです問題を再現するためにセッションが必要ですか?つまり、 'session_start()'を削除すると、期待どおりに動作しますか?あなたの質問は、セッションはまったく必要ないことを示唆していますが、私はなぜあなたが言及するのだろうかと思います。 –

+1

'session_start()'コードはまったく同時に実行されません。要求は一度に1つずつ処理されます。 'session_start()'では、最初のリクエストは他のリクエストの前に処理され、残りのリクエストは同時に実行されます。 – nicks

答えて

10

apcaheは同時に複数のリクエストを処理できますが、apache設定内で間違ったことが起こっている可能性があります。

使用しているApacheのバージョンとその構成方法によって異なりますが、共通のデフォルト構成では複数のスレッドを持つ複数のワーカーが同時に要求を処理します。これがどのように動作するかについては、http://httpd.apache.org/docs/2.2/mod/worker.htmlを参照してください。

あなたが直面している理由は次のとおりです。 ロックはどこかにあります。たとえば、2つのリクエストが同じクライアントから来て、PHPでファイルベースのセッションを使用している場合などです。スクリプトが実行されている場合、セッションはロックされています。つまり、サーバー/クライアントは、ファイルを使用して2番目のユーザーのセッションを開くことができるように、最初の要求が完了するまで待つ必要があります。

リクエストは同じクライアントと同じブラウザから送信されます。ほとんどのブラウザーは、このような動作を引き起こすサーバー側がない場合でも、この場合に要求をキューに入れます。

3

セッションがロックされている可能性があります。セッション変数を編集する必要がない場合は、それを閉じます。

http://php.net/manual/en/function.session-write-close.php

+0

いいえ、助けてくれなかった – nicks

+0

多分これをチェックしてください:http://stackoverflow.com/a/2531667/4007002 この問題は他のブラウザにも影響しますか? –

-1

は、データベースへのファイルの保存セッションを移動することができます - あなたは待つことなく、一度にすべてのファイルを要求する可能性を持っているだろうより - または - スクリプトの中で、あなたがそれをオフにセッションを必要としない場合には( session_start();を使用しないでください)

+1

私は最初に使っていません。私が言ったように、私は 'sleep(10)'を除いてファイルに何も持っていません。 – nicks

0

別のブラウザのタブ/ウィンドウ/インスタンスで同時通話しようとしましたか?

Apacheはマルチスレッドなので、並列リクエストを確実に処理できます。 apacheの上で、あなたの設定を確認してくださいhttps://httpd.apache.org/docs/2.4/programs/ab.html

  • を見てみましょう -

    • (Apacheのベンチマークのように)テストするために適切なクライアントとのリクエストを行います。あなたが確認するためにいくつかのものを持っているようです。一度に1つのリクエストのような奇妙な動作を引き起こす可能性のある設定が間違っています。 httpd.confでforkとworkerのパラメータを見てください。提案:テストにはすべてのデフォルトパラメータを使用します。

  • 0

    Apacheには、クライアント要求の処理方法を指示するさまざまなマルチプロセッシングモジュール(ApacheではこれらのMPMが呼び出されます)が用意されています。基本的に、これにより、管理者は接続処理アーキテクチャを簡単にスワップアウトできます。これらは:

    1. mpm_prefork:この処理モジュールは、各要求を処理するために単一のスレッドを持つプロセスを生成します。各子供は一度に単一の 接続を扱うことができます。
    2. mpm_worker:このモジュールは、複数のスレッドをそれぞれ管理できるプロセスを生成します。これらのスレッドはそれぞれ単一の 接続を処理できます。プロセスより多くのスレッドがあるため、これは新しいプロセスが空きプロセスを待つのではなく、ただちにスレッ​​ドを解放できることを意味します。
    3. mpm_event:このモジュールはほとんどの 状況ではワーカーモジュールに似ていますが、キープアライブ接続を処理するように最適化されています。作業者MPMを使用して を使用すると、 接続が有効になっている限り、要求がアクティブに行われているかどうかにかかわらず、接続には に関係なくスレッドが保持されます。
    0

    セッションクローズの前にセッション内にsleepとphpinfoを含めてみてください。 セッションのように見えます(5つはすべて同じものとして扱われ、最初は終了して終了します)。おそらく、セッションIDが同じかどうかを確認してください。 セッションを開いたままにすることで、セッションが同時に処理されていることがわかります。

    関連する問題