PHP開発では、 session_register_shutdown()は、特にセッションデータの自動保存と閉鎖を伴う場合、比較的役に立たないが非常に実用的な機能です。この記事では、この機能、使用シナリオ、およびベストプラクティスの使用について詳しく説明します。
session_register_shutdown()は、スクリプトの実行が終了したときにsession_write_close()を自動的に呼び出す内蔵PHP関数です。その主な機能は、スクリプトの実行後にセッションデータが正しく記述され、閉じられていることを確認し、データの損失を回避したり、問題をロックしたりすることです。
言い換えれば、この関数を呼び出すことは、スクリプトが終了したときに実行されたセッションクロージングフックを登録するのと同等です。この関数の使用は、 session_write_close()を手動で呼び出すよりも安全であり、複雑なビジネスロジックまたは長い接続処理の後にセッションデータがサーバーに安全に書き込まれるようにするのに特に適しています。
<?php
session_start();
session_register_shutdown();
// ユーザーの動作ログを記録するとします
$_SESSION['last_action'] = time();
// 将来的には多くの論理処理があるかもしれません,たぶん事前にさえ exit
if ($_GET['debug'] === '1') {
exit("デバッグモード,実行し続けないでください");
}
// スクリプトは他の操作を引き続き実行します
?>
上記のコードでは、 exit()が途中で使用されている場合でも、スクリプトが終了するとセッションデータが正しく記述されるようにします。
コードのある時点でsession_write_close()を手動で呼び出すことができますが、これにはセッションデータが再び変更されない時期を正確に知る必要があります。複数の条件付きブランチを備えた大規模なプロジェクトまたはスクリプトでは、この手動処理はミスまたはエラーになりやすいです。
session_register_shutdown()を使用すると、特に次のシナリオで、スクリプトが終了するときにsession_write_close()が均一に呼ばれるようにします。
スクリプトが例外またはエラーの早い段階で終了した場合。
出力キャッシュまたは非同期タスク処理。
複雑な状態を含むブランチまたはミドルウェア構造で。
ob_start()やob_end_flush() )などの出力バッファリング関数を組み合わせると、 session_register_shutdown()は、出力とセッションの書き込みの正しい順序を確保し、ヘッダー情報を送信した後のセッションの節約障害を回避できます。
<?php
session_start();
session_register_shutdown();
ob_start();
$_SESSION['visit_count'] = ($_SESSION['visit_count'] ?? 0) + 1;
echo "訪問してください,これがあなたの最初です {$_SESSION['visit_count']} 訪問。";
ob_end_flush();
?>
PHPバージョン: session_register_shutdown()は、PHP 5.4以降導入されました。サーバーがまだ古いバージョンを使用している場合は、使用しないでください。
自動コール制限:この関数は、セッションの開始後(つまり、 session_start()後)にのみ使用できます。それ以外の場合は無効です。
繰り返しの呼び出しを避けてください:一般的に、一度電話する必要があります。繰り返される呼び出しはエラーを引き起こしませんが、実用的な意味もありません。
開発するフレームワークまたはカスタムポータルファイル(たとえば、 index.php )では、 session_register_shutdown()を使用してセッションエンドフックを登録することをお勧めします。これにより、ビジネスロジックでsession_write_close()を明示的に呼び出す必要性を減らし、コードの堅牢性とメンテナンスを改善することができます。
さらに、ウェブサイトにユーザーログインステータスの判断または動作記録が含まれている場合は、セッションデータを安定して記述できることを確認してください。例えば: