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


85

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

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

1
この回答も確認してください:konrness.com/php5/how-to-prevent-blocking-php-requests
trante

回答:


140

サーバーは、その構成に応じて、通常、同時に数百の要求を処理MaxClientsできます。Apacheを使用している場合、構成オプションは次のようになります。

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


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

そう :

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

番号 ; 場合を除き :

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


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

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

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


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

はい^^


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

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

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

  • ウェブサーバーはリクエストを処理するために別のプロセスをフォークします(多くの場合、パフォーマンス上の理由から、これらのフォークは事前に作成されますが、これは何も変更しません)
  • プロセスはディスクからPHPスクリプトを読み取ります
    • 複数のプロセスが同時にこれを行うことができます:ファイルの読み取りにロックはありません
    • ファイルがメモリにロードされます; プロセスごとに異なるメモリブロック内
  • メモリ内のPHPファイルはオペコードに「コンパイル」されています-まだメモリ内にあります
  • それらのオペコードは実行されます-それでもあなたの要求に答えるプロセスに属するメモリのブロックから


実際には、2人のユーザーが同じPHPスクリプト(またはすべて同じPHPファイルを含む別個のPHPスクリプト)にリクエストを送信することができます。それは間違いなく問題ではありません、または私が今まで取り組んだウェブサイトのどれも機能しませんでした!


複数の同時リクエストが同じphpファイルにアクセスしている場合、結果はどうなりますか。他のリクエストは保留されたままになりますか、それとも各リクエストに独自のスクリプトインスタンスがありますか?
ケビン・ボイド

3
「スクリプトインスタンス」のようなものはありません。各リクエストは個別のプロセス(またはスレッド)によって処理されます;; スクリプトはメモリ/ディスクから読み取られますが、同じファイルを同時に多くのプロセスから問題なく読み取ることができます(少なくとも、「最新の」オペレーティングシステム(つまり、WindowsとLinuxの両方)
Pascal MARTIN

これは優れた答えです。PHPがどのように機能するかについて、どこで詳細を知ることができますか?これに適した本はありますか?
ケビン・ボイド

1
私はそれについて本当に知りません:私はマニュアルを読み、ネット上の記事を読み、あちこちで質問/回答を読み、そして数年間PHPで作業することは学ぶための良い方法だと思います-しかし私はできます」 PHPがどのように機能するかを正確に説明する本を本当にお勧めします;; 「PHPの拡張と埋め込み」にはいくつかの情報がありますが、その主題はPHPがどのように機能するかを説明することではありません;; 多分php.net/manual/en/internals2.phpが役立つでしょうか?
パスカルマーティン

完璧!とても助かりました!
zookastos 2016

21

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

つまり、同じマシン上で、2つのブラウザを使用して同じウェブサイト/ページを同時にロードする場合は、両方を同時にロードする必要があります。

ただし、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サイトでは、セッションを使用しなくなったときに()を呼び出すことをお勧めします。


4

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


3

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.