セッション管理は、PHPを使用したWebアプリケーションの構築の非常に重要な部分です。特に、2つの関数session_register_shutdown()とsession_start()の使用に関しては、多くの開発者が通話順序を混乱させることが多く、セッションデータが適切に保存されないか、その他の予測不可能な動作を行います。この記事では、これら2つの機能の役割、通話タイミング、およびセッション機能の安定した動作を確保するためにコードを正しく整理する方法について詳しく説明します。
session_start()は、セッションを開始するために使用される関数です。サーバーに既に存在するセッションファイルを読み取り、データを$ _Session HyperGlobal Arrayにロードします。対応するセッションファイルがない場合、新しいセッションIDを作成し、空のセッションを初期化します。
例:
session_start();
$_SESSION['user'] = 'Alice';
session_register_shutdown()は、PHPが提供する関数であり、セッションの償却フックを登録します。これにより、スクリプトが終了する前にセッションデータが自動的に保存されます。これは、セッションデータをスクリプトライフサイクルの最後の最後に記述する必要があるシナリオに役立ちます。
session_start()が自動的に登録するため、この関数は通常、手動コールを必要としません。ただし、カスタムセッションプロセッサを使用している場合、またはいくつかの特別なフレームワークのセッションライフサイクルをカスタム制御する場合、手動でそれを理解して呼び出すことが特に重要です。
最も重要なルールは、セッションデータにすべての読み取りまたは書き込みの前にsession_start()を呼び出す必要があり、 session_register_shutdown()が登録される前に呼び出される必要があります(手動で登録することを選択した場合) 。
エラーの例(セッションデータが正しく保存されないようにします):
session_register_shutdown();
session_start(); // ? 間違った順序の呼び出し
正しい例:
session_start();
session_register_shutdown(); // ? 正しい順序の呼び出し(手動で登録する必要がある場合)
ほとんどのシナリオでは、PHPが登録シャットダウンフックを自動的に処理するため、 Session_start()を呼び出すだけです。ただし、たとえば複雑なスクリプトでは、カスタムセッション保存メカニズムがあります。
session_set_save_handler(
[$handler, 'open'],
[$handler, 'close'],
[$handler, 'read'],
[$handler, 'write'],
[$handler, 'destroy'],
[$handler, 'gc']
);
session_start();
session_register_shutdown(); // 明示的な呼び出し,確認する session スクリプトの最後に書き込みます
session_start()は、任意の出力(echoやhtmlなど)の前に呼び出される必要があります。そうしないと、「セッションクッキーを送信できません - 既に送信されたヘッダー」のエラーが表示されます。その前にコンテンツやスペースの出力がないことを確認してください。
Cookieが無効になっている場合、PHPはPHPSESSIDパラメーターをURLに追加します。推奨されていませんが、以下などの場合によっては、誰かがまだ使用しています。
$url = "https://m66.net/dashboard.php?" . SID;
echo "<a href=\"$url\">コントロールパネル</a>";
SIDはPHPによって提供される定数であり、URLにセッションIDを自動的に追加するために使用されます。 Cookieが有効になっている場合、 SIDは空の文字列であることに注意してください。
スクリプトの前で常にsession_start()を呼び出してください。
カスタムセッションの保存メカニズムを使用する場合、 Session_register_shutdown()を明示的に呼び出すことができますが、注文はsession_start()の後にする必要があります。
session_start()の前にコンテンツの出力を避けてください。
URLを使用してセッションIDに合格するにはセキュリティリスクがあるため、Cookieを使用してみてください。
正しいセッション管理は、プログラムの安定性を改善するだけでなく、セキュリティとユーザーエクスペリエンスを向上させるのに役立ちます。この記事が、これらの2つの機能がどのように使用されるかをよりよく理解するのに役立つことを願っています。