web-dev-qa-db-ja.com

Apacheが同時に複数のリクエストを処理できないのはなぜですか?

AMPPSをインストールしました。

私の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つは最初の要求が終了するのを待ってから、同時に終了しました。

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

14
nicks

Apacheは同時に複数のリクエストを確実に処理できます。Apache構成内で間違いが発生しています。

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

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

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

23
kshitij

おそらくセッションのロックが原因です。セッション変数を編集する必要がない場合は、閉じてください。

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

4
Viktor Koncsek

セッションを操作し、script.phpの開始時に書き込みます

// manipulate writes, and unlock session file!
session_start();
$_SESSION['admin'] = 1;
$_SESSION['user'] = 'Username';
session_write_close(); // unlock session file, to another script can access

// start your script without php session block
sleep(30); 
echo $_SESSION['user'];

// another script can run without wait this script finish
3
Leonardo Filipe

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

0
Kumar

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

  1. mpm_prefork:この処理モジュールは、リクエストを処理するために、それぞれ単一のスレッドでプロセスを生成します。各子は一度に1つの接続を処理できます。
  2. mpm_worker:このモジュールは、複数のスレッドをそれぞれ管理できるプロセスを生成します。これらの各スレッドは、単一の接続を処理できます。プロセスよりもスレッドが多いため、新しい接続は、空きプロセスを待つ必要がなく、すぐに空きスレッドを取得できます。
  3. mpm_event:このモジュールは、ほとんどの状況でワーカーモジュールに似ていますが、キープアライブ接続を処理するように最適化されています。ワーカーMPMを使用する場合、接続が存続している限り、要求がアクティブに行われているかどうかに関係なく、接続はスレッドを保持します。
0
swaroop suthar

同様の問題が発生しました。サーバーへの接続中に、複数のリクエストがランダムにハングし続けました。

使用しないで、mpm構成を変更しようとしました。

最後に、これは私にとって問題を解決するようです。 (- https://serverfault.com/a/680075 から)

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off 
0
Thiagesh thg

異なるブラウザータブ/ウィンドウ/インスタンスで同時呼び出しを試みましたか?

Apacheはマルチスレッドであるため、並列要求を確実に処理できます。チェックすべきことがいくつかあります:

  • テスト用の適切なクライアント(Apacheベンチマークなど)を使用してリクエストを作成します。 https://httpd.Apache.org/docs/2.4/programs/ab.html を見てください。

  • Apacheの設定を確認してください。一度に1つの要求のように、奇妙な動作を引き起こす可能性があるいくつかの誤った設定があります。 httpd.confでforkとworkerのパラメーターを見てください。提案:テストにはすべてのデフォルトパラメータを使用します。

0
Tiago Luz