質問
PHPエンジンが既にサーバーでスクリプトを実行している場合、同じスクリプトに対する他の同時ブラウザー要求はどうなりますか?
- リクエストはキューに入れられますか?
- それらは無視されますか?
- 各リクエストには独自のスクリプトがありますか インスタンス?
- その他の可能性
解決
サーバーは、その構成に応じて、一般に数百のリクエストを同時に処理できます-Apacheを使用している場合、 MaxClients
という設定オプションは、次のように言っています:
MaxClients
ディレクティブは、 同時数の制限 提供されるリクエスト。
任意 接続試行 通常、MaxClients
の制限は に基づく数までのキュー ListenBacklogディレクティブ。
一度子供 プロセスは、の終わりに解放されます 別のリクエスト、接続は サービスを受けます。
2つのクライアントが同じページを要求するという事実は問題ではありません。
だから:
リクエストはキューに入れられますか?
いいえ。次の場合を除く:
- どこかにいくつかのロックがあります。たとえば、2つのリクエストが同じクライアントから送信され、PHPでファイルベースのセッションを使用している場合に発生する可能性があります:スクリプトの実行中、セッションは「ロック」されます。つまり、サーバー/クライアントは、最初のリクエストが完了するまで待つ必要があります(およびファイルのロック解除)ファイルを使用して2番目のユーザーのセッションを開きます。
- リクエストは同じクライアントと同じブラウザからのものです。この場合、ほとんどのブラウザはこの動作を生成するサーバー側が存在しない場合でもリクエストをキューに入れます。
- 現在アクティブなプロセスは
MaxClients
以上です-直前のApacheのマニュアルからの引用を参照してください。
無視されますか?
いいえ:これは、1人のユーザーのみが同時にWebサイトを使用できることを意味します。これはあまりいいことではないでしょうか?
もしそうなら、誰かが答えたかどうかを確認するために同時にF5を押すと、この答えを投稿できませんでした!
(まあ、SOはPHPにはありませんが、原則は同じです)
他の可能性はありますか?
はい^^
OPとコメントを編集した後、編集:
各リクエストには独自のスクリプトがありますか インスタンス?
" スクリプトインスタンス"などはありません。 :簡単に言えば、スクリプトへのリクエストが行われた場所で何が起こっているのかということです:
- ウェブサーバーはリクエストを処理するために別のプロセスをフォークします<パフォーマンス>、多くの場合、これらのフォークは事前に作成されますが、これは何も変わりません
- プロセスはディスクからPHPスクリプトを読み取ります
- 複数のプロセスが同時にこれを行うことができます:ファイルの読み取りをロックしません
- ファイルはメモリにロードされます。各プロセスの個別のメモリブロック内
- メモリ内のPHPファイルは&quot; コンパイル&quot;オペコードへ-まだメモリ内にあります
- これらのオペコードは実行されますが、リクエストに応答するプロセスに属するメモリブロックから
実際、2人のユーザーが同じPHPスクリプト(またはすべて同じPHPファイルを含む別個のPHPスクリプト)にリクエストを送信することができます。それは間違いなく問題ではない、または私が今まで取り組んだウェブサイトのどれも動作しません!
他のヒント
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サイトで。
これに出くわしました。基本的に、シングルユーザーのロックを防ぐために session_write_close()
を呼び出す必要があります。ただし、 session_write_close()
を呼び出したら、セッション変数を変更しようとしないでください。一度呼び出したら、それ以降はセッションを読み取り専用として扱います。
非常に非標準のセットアップを実行している場合を除き、Webサーバー(Apache、IIS、nginxなど)には、サーバーに着信するリクエストごとに個別にPHPを実行する複数のプロセスがあります。同時リクエストは同時に処理されます。