Web開発にPHPを使用する場合、セッションは私たちにとって非常に一般的な国家維持ツールです。しかし、 $ _Sessionデータが明確に設定されているが、いくつかのリクエストの後に再びアクセスされると失われたデータが発生したことがありますか?または、 session_write_close()に電話した後、データはまだ予想どおりに記述されていませんか?これらの問題のルートは、session_register_shutdown()機能をよく使用したり理解したりしていない可能性があります。
session_register_shutdown()は、セッションを登録するPHPの関数であり、クローズコールバックを書き込みます。簡単に言えば、その機能は、スクリプトが実行されたときに、PHPが自動的にsession_write_close()を呼び出して$ _sessionデータを安全に保存することを確認することです。
「セッションを管理するのに役立つフレームワークではありませんでしたか?」と言うかもしれません。実際、ほとんどの最新のフレームワーク(Laravel、Symfonyなど)は、すでにセッションのライフサイクル管理を下部にカプセル化していますが、一部のネイティブPHP開発または軽量フレームワークでは、この詳細は見過ごされがちです。
デフォルトでは、PHPはスクリプト実行の終了時にセッションデータを保存しようとします。ただし、 exit() 、中央でdie()を呼び出す場合、または例外のためにスクリプトが早期に終了する場合、セッションは正常に記述されない場合があります。例えば:
session_start();
$_SESSION['user'] = 'Alice';
header('Location: https://m66.net/next-page.php');
exit();
上記のコードでは、 exit()の存在のために$ _session ['user']に値を割り当てますが、 session_write_close()がsession_start()を呼び出した後に明示的に呼び出されない場合、セッションデータはディスクまたはメモリに正常に書き込まれない場合があります。
解決策は、 session_register_shutdown()を使用して、スクリプトの最後にセッションを自動的に閉じる関数を登録することです。
session_start();
session_register_shutdown();
$_SESSION['user'] = 'Bob';
header('Location: https://m66.net/profile.php');
exit();
このラインsession_register_shutdown()を介して、データが失われないようにスクリプトが中央で終了する場合でも、シャットダウン段階でsession_write_close()を実行するようにphpに指示します。
セッションを手動で処理する必要がある場合は、組み合わせて使用することもできます。
function close_session_safely() {
if (session_status() === PHP_SESSION_ACTIVE) {
session_write_close();
}
}
session_start();
session_register_shutdown('close_session_safely');
$_SESSION['authenticated'] = true;
このように、 exit()またはdie()が中央で発生した場合でも、致命的なエラーのためにスクリプトが中断されない限り、 $ _Sessionデータを正しく保存できます。
この関数は、セッションの開始後にのみ使用できます。つまり、 session_start()の後でなければなりません。
session_register_shutdown()はPHP 5.4+で利用できますが、一部の管理環境では無効になる場合があります。使用する前に構成を確認するのが最善です。
多くのセッションデータは、一貫性のないバグと欠落しているバグが、実際にセッションのライフサイクルを適切に管理していないことによって引き起こされます。 session_register_shutdown()を使用することはわずかな追加ですが、安定性が大幅に改善される可能性があります。特に、フレームワークレスPHPアプリケーションを開発している場合、この習慣を開発することで、多くの落とし穴を回避できます。
次回セッションの例外をデバッグするときは、シャットダウン機能の登録を忘れたかどうかも確認できます。結局のところ、良いコードを書くと「実行可能」になるだけでなく、「信頼性」になります。
関連タグ:
session