web-dev-qa-db-ja.com

PHPスクリプトへの同時リクエスト

PHPエンジンがすでにサーバーでスクリプトを実行している最中である場合、同じスクリプトに対する他の同時ブラウザー要求はどうなりますか?

  • 要求はキューに入れられますか?
  • それらは無視されますか?
  • 各リクエストには独自のスクリプトインスタンスがありますか?
  • 他の可能性はありますか?
83
Kevin Boyd

サーバーは、その構成に応じて、通常、何百ものリクエストを同時に処理できます-Apacheを使用している場合、MaxClients設定オプションは、

MaxClientsディレクティブは、処理される同時要求の数の制限を設定します。
MaxClients制限を超える接続試行は、通常、ListenBacklogディレクティブに基づいた数までキューに入れられます。
別のリクエストの終了時に子プロセスが解放されると、接続が処理されます。


2つのクライアントが同じページを要求するという事実は問題ではありません。

そう :

リクエストはキューに入れられますか?

いいえ。場合を除き :

  • いくつかのlockがあります-例えば、2つのリクエストが同じクライアントから来て、PHPのファイルベースのセッション:スクリプトの実行中、セッションは「ロック」されます。つまり、サーバー/クライアントは最初のリクエストが完了するまで待機する必要があります。ファイルを使用して2番目のユーザーのセッションを開くことができるように(およびファイルのロック解除)が終了しました。
  • リクエストは同じクライアントと同じブラウザから送信されます。この場合、ほとんどのブラウザはこの動作を生成するサーバー側が何もない場合でもリクエストをキューに入れます。
  • 現在アクティブなプロセスはMaxClients以上あります。直前のApacheのマニュアルからの引用を参照してください。


それらは無視されますか?

いいえ:これは、1人のユーザーのみが同時にWebサイトを使用できることを意味します。これはあまりいいことではないでしょうか?

その場合、誰かが答えたかどうかを確認するために同時にF5を押すと、この答えを投稿できませんでした!
(まあ、SOはPHPにはありませんが、原則は同じです))


他の可能性はありますか?

はい^^


OPとコメントを編集した後に編集します:

各リクエストには独自のスクリプトインスタンスがありますか?

"script instance"のようなものはありません:簡単に言えば、スクリプトへのリクエストが行われた場所で何が起こっているかです:

  • webサーバーフォーク別のプロセスリクエストを処理する(多くの場合、パフォーマンス上の理由から、これらのフォークは事前に作成されますが、これは何も変わりません)
  • プロセスは、PHP script from disk
    • 複数のプロセスが同時にこれを行うことができます:ファイルの読み込みにロックはありません
    • ファイルはメモリにロードされます。各プロセスの個別のメモリブロック内
  • PHPメモリ内のファイルはオペコードに「compiled」-メモリ内にあります
  • これらのオペコードは実行されます-リクエストに応答するプロセスに属するメモリブロックから


実際には、同じPHP script(または異なるPHPすべて同じPHP file)を含むスクリプト;それは間違いなく問題ではない、または私が今まで取り組んだウェブサイトのどれも動作しません!

138
Pascal MARTIN

2つのクライアントが同時にサーバーを呼び出す場合、サーバーはほとんどの場合、両方のクライアントにほぼ同時に応答できます。ここのクライアントは、ブラウザレベルに定義します。

同じマシン上で、2つのブラウザーを使用して同じWebサイト/ページを同時に読み込む場合、両方を同時に読み込む必要があるということです。

ただし、PHPについて説明しているので、セッションに関する特別なメモを取る必要があります。ページがセッションを使用する場合、サーバーは一度に1ページのみを提供します。これは、スクリプトが終了するまでセッションファイルがロックされるためです。

この例を見てください。 2つのファイルは、同じセッション、つまり同じブラウザ、同じユーザーから読み込まれます。

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Scriptb.phpは、scripta.phpが提供された後にのみ開始されることに注意してください。これは、scripta.phpが開始されると、セッションファイルが他のスクリプトにロックされ、scripta.phpがセッションファイルに書き込むことができるためです。 scripta.phpが完了すると、セッションファイルのロックが解除され、他のスクリプトが使用できるようになります。したがって、scriptb.phpはセッションファイルが解放されるまで待機し、その後セッションファイルをロックして使用します。

このプロセスは繰り返し行われ、複数のスクリプトが同じセッションファイルに書き込んで遅延が発生するのを防ぎます。したがって、 session_write_close ()セッションを使用しなくなったとき、特に多くのiframeまたはAJAXを使用しているWebサイトで。

19
mauris

自分でこれに出くわしました。基本的に、シングルユーザーのロックを防ぐために、session_write_close()を呼び出す必要があります。 session_write_close()を呼び出したら、セッション変数を変更しようとしないでください。一度呼び出したら、それ以降はセッションを読み取り専用として扱います。

4
Justin

非常に非標準のセットアップを実行している場合を除き、Webサーバー(Apache、IIS、nginxなど)には、サーバーに着信するリクエストごとにPHPを個別に実行する複数のプロセスがあります。リクエストは同時に処理されます。

3
conceptDawg