web-dev-qa-db-ja.com

サーバーとリクエストの理解

サーバーがphpアプリケーションを実行するために何をするのか知りたいです。以下は私が思うことです:

クライアントAタイプwww.blahblahblah.blah /

  1. サーバーはURLやディレクトリなどを解決します。
  2. サーバーはindex.phpに移動します
  3. index.phpには、instanceと呼ばれる静的変数を持つシングルトンパターンクラスがあります。

サーバーは独自の静的変数にメモリを割り当てますかRAMこの最初のリクエストに続くすべてのリクエストが同じ静的変数を使用するように?OR for新しいリクエストごとに、サーバーは新しいメモリを割り当て、その新しいメモリにはその静的変数に割り当てられた新しいスペースがありますか?

私の混乱:すべてのリクエストが独自のメモリスペースで実行される場合、永続的な接続とは何ですか?

2番目に疑問に思うのは、Webアプリケーションに特別なキーを継続的に送信するデスクトッププログラムを作成し、Webアプリケーションがキーを継続的に返送して、HTTPをコネクションレスではなくフル接続にすることはできますか?そうすれば、誰がインターネットに接続しているのかではなく、誰がクライアントとして自分のAPPに接続しているのかを確認できます。私はセッションを知っていますが、http接続が少なくなり、なりすましやセッションハイジャックの可能性があります。セッションを安全にすることができることは知っていますが、それでも私のアプリはクライアントが死んでいるかどうかを認識せず、セッションからデータを削除して、クライアントの何とかが切断されていることを他の人に伝えることができます。

1
Khurram Ijaz

HTTPは基本的にステートレスです。これは、クライアントからの要求から始まり、クライアントが応答を受信したときに終了するライフサイクルがあり、このライフサイクルの外では、実行されているコードがないことを意味します。少なくともPHP)では、スクリプトはリクエストごとに完全に新しく開始されるため、静的変数などを使用するだけでは、あるリクエストから次のリクエストに状態を永続化することはできません。このため、ユーザーがブラウザを閉じたときにサーバー上で検出することはできません。接続は、要求/応答サイクルが完了するとすぐに(つまり、クライアントが応答を受信したときに)終了します。これと状態の維持は、 Webアプリケーションプログラミング、およびそれらを(部分的に)解決するためにいくつかのトリックが考案されました。

状態は、いくつかの方法で次の要求に持ち越すことができます。

  • 状態を非表示フィールドに入れ、ポストバックでそれらを読み戻します(基本的に、状態を前後に投稿します)
  • セッションを使用します(IDをクライアント側に保存し、各リクエストと一緒に送信し、状態を含む一連のセッションファイルをサーバーに保持します)
  • URLに状態をエンコードします(たとえば、誰かがページを表示している言語、表示しているオブジェクトなど)

切断を検出する限り、実際に実行可能な唯一の方法は「ハートビート」です。数秒ごとに非常に短いajaxメッセージを送信します(セッションIDまたはユーザーIDを使用して、どこから来ているかを確認してください)。サーバーでハートビートメッセージの受信を停止すると、クライアントが切断されたことがわかります。もちろん、これはJavaScriptが有効になっている場合にのみ機能し、余分な帯域幅を消費し(それほど多くはありません)、サーバーに余分な負担をかけます(1,000人のユーザーの場合、1秒あたり1ハートビートは、1分あたり60,000リクエストを処理する必要があることを意味します) 、およびネットワークの遅延が大きすぎると、信頼性の低い結果が得られます。

持続的接続はこれとは何の関係もありません。これらは、同じホストへの後続の要求のために新しい接続を確立するオーバーヘッドを回避するためのHTTPレベルの最適化です。 PHPに関する限り、永続的な接続は透過的です。つまり、PHPは、接続が永続的であるかどうかに関係なく同じように動作します。

6
tdammers