2012-03-05 8 views
3

どうすればsession_start()の機能が働くか説明してください。session_start()関数の仕組みは?

私はPHPでセッションを開始するときの動作の順序を理解していません。説明しよう。

HTTPはクライアント/サーバーアーキテクチャです。これは、ブラウザが要求を送信し、サーバーが要求を処理し、その応答を返すことを意味します。これらのアクションのそれぞれには、適切なヘッダーがあります。

私はセッションを開始したいときに、応答でサーバーから返されるヘッダーを(headers_list()で)チェックしました。とりわけ、すべてがOKであると思われるヘッダ

Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8 

があると、サーバーはクッキーを設定するブラウザに順序を与えます。

しかしセッションを開始するには、ページのコードの先頭にsession_start()関数を含める必要があります。この機能は、ブラウザがページの解析を開始するときに開始されます。ブラウザは、PHPオープンタグ<?php、それに続いてsession_start()の機能を満たしています。直ちに、制御をサーバーに委譲します。そして、サーバーは今だけ機能を開始します。すべてのヘッダーを含むページを既にブラウザに送信した場合のみ。

ブラウザがページの解析を開始してsession_start()機能を満たす前に、サーバーがSet-Cookieヘッダーを送信する方法を理解できません。コマンドsession_start()が実行される前に、Set-Cookieヘッダーを挿入する必要があることをどのように知っていますか?または私はプロセスを誤解していますか?

答えて

12

サーバーとしてApacheを使用して回答します。

ページがサーバーに要求されると、Apacheはそのページを適切なドキュメントにルーティングします。

特定の文書タイプがSAPIに関連付けられている場合、そのSAPIに制御が委譲されます。 PHPスクリプトの場合、これは通常PHPのApacheモジュールです。

あなたのPHPはSAPIによって実行されます。

  • クライアントがsession_name()にちなんで名付けられたクッキーを送った場合には、チェック:あなたはsession_start()を呼び出すと、PHPは、いくつかのことを行います。そのCookieにはセッションIDが含まれています。それが存在しなければ、新しいセッションIDでそれを作成します。

  • それは、セッションプロバイダ(シリアライズされたセッションデータを含むファイルとして、サーバーの一時フォルダ内のデフォルトのプロバイダが格納セッションデータ)から、そのセッションIDに関連付けられたセッションデータをロードし、スーパーグローバル$_SESSIONでそれが利用できるように

  • それはバックプロバイダを介して、セッションデータを保存するために、シャットダウンコールバックを登録します。

スクリプトは通常の実行フローを継続し、出力はApacheに送信されてクライアントに送信されます。

セッションは完全にSAPIによって処理されます。 SAPIに制御を移管以外は、Apacheは何もしません。

ほとんどのPHPインストールでは、すべての出力(ヘッダーとボディー)がApacheにフラッシュされるまでバッファーに格納されます(明示的にob_flush()または暗黙のうちにスクリプトの最後に格納されます)。出力バッファリングがオンの場合、PHPは体の前にヘッダが送信されますので、

、あなたはどこにでも最初のフラッシュの前にsession_start()を呼び出すことができます。新しいセッション(クッキーが送信される)の場合には

クライアントはページの実行のみの後にセッションIDを受信した場合、それは問題ではありません:それは次の要求のためにそれを持っています。セッションIDは、セッションデータを復元するためのキーです。誰かがあなたのセッションIDを盗み、あなたがサーバー・ソード・チェックをしていないと、セッション・データが侵害されます。

は、詳細については、基本的にこの問題が発生したanother one of my answers.

1

PHPはサーバー側の言語で、ブラウザでは解析されず、Webサーバーによって解析されます。次に、ヘッダーとコンテンツをHTTP(または使用しているその他のプロトコル)を介してブラウザに送信します。

単純な意味で、関数呼び出しsession_start()は、WebサーバーにセッションIDと関連セッションデータを保存するように指示します(たとえば、$ _SESSIONで何かを設定した場合)。セッションIDを持つクライアントにヘッダーを送信し、セッションIDをクッキーに格納します。つまり、サーバーは個々の訪問者に情報を関連付けることができます。

1

を読むこと自由に感じ:

  • クライアントがページを要求すると、URLを送信し、任意のクッキーそれは
  • PHPがstart_session
  • を呼び出していますPHPは、セッションクッキーが存在するかどうかをチェックし、それがない
ない場合は、1つを作成します