PHPでは、 session_register_shutdown()は、セッションの終了時に自動的に実行されるコールバック関数を登録するために主に使用されるセッション処理に関連する関数です。その機能は、セッションデータを最終的に処理して保存できるように、スクリプトの最後に登録されたコールバック関数が呼び出されるようにすることです。
簡単に言えば、 session_register_shutdown()は、php 5.4で導入された関数です。その主な目的は、セッションの書き込みを終了するために、古いバージョンのsession_write_close()への手動コールを置き換えることです。この関数を呼び出した後、PHPはスクリプト実行の最後にsession_write_close()を自動的に呼び出して、セッションデータが正しく記述されるようにします。セッションの欠落によるデータ損失のリスクを回避するため、クローズドコールバックを自動的に登録します。
PHPのデフォルトセッションメカニズムはファイルロックベースであり、他のリクエストはセッションファイルのロックが解除された後にのみ同じセッションにアクセスできます。通常、ファイルロックは、session_write_close()への呼び出し後にのみリリースされます。 session_register_shutdown()を呼び出すことにより、セッションの実行者がセッションを閉じるのを忘れていることによるブロッキングの問題を回避するために、セッションファイルロックがスクリプト実行の最後に自動的にリリースされます。
一部のシナリオでは、プログラムは中央のセッションデータを変更する必要がありますが、後続のコードが引き続きセッションを使用し続けるため、セッションの書き込みをすぐに閉じたくありません。自動コールバックを登録することにより、スクリプトが最終的にセッションを安全に閉じることを保証し、未保存のデータの問題を回避します。
従来の執筆では、セッションデータが書かれていることを確認するために、開発者はsession_write_close()を明示的に呼び出す必要があります。これは、大規模なプロジェクトや複雑な制御プロセスで見落とされたり見逃されたりします。 session_register_shutdown()を呼び出した後、システムはこのステップを自動的に完了し、ヒューマンエラーの可能性を減らします。
この期間中にセッションデータを複数回読み取って書き込む長期にわたるスクリプトがある場合、セッションの閉鎖を手動で管理することは面倒です。 session_register_shutdown()を使用すると、スクリプトの最後にスクリプトが自動的に書き込まれ、閉じられていることを確認し、コードの信頼性を向上させます。
<?php
session_start();
session_register_shutdown();
$_SESSION['step1'] = 'データは保存されています...';
// 真ん中に複雑なロジックと長期にわたるコードがあるかもしれません
$_SESSION['step2'] = '処理が完了します';
?>
同時リクエストシナリオでは、セッションが時間内に閉じられない場合、リクエストはブロックされます。登録は自動的に閉じられ、ロックはできるだけ早くリリースできます。
<?php
session_start();
session_register_shutdown();
// セッションデータを読み取り、変更します
$_SESSION['user'] = 'チャン・サン';
// その後のロジックでは、セッションを頻繁に閉鎖する必要はありません,システムの自動処理
?>
一部のフレームワークまたはカプセル化ライブラリでは、セッション操作がコンポーネントとしてカプセル化されています。発信者はセッションを開始するだけで、閉じたときに気にする必要はありません。 session_register_shutdown()を通じて、セッションは自動的に閉じられます。
<?php
function startSession() {
session_start();
session_register_shutdown();
}
// フレームワークが開始されたときに呼び出されます
startSession();
// ビジネスロジック
$_SESSION['role'] = 'admin';
?>
session_register_shutdown()は、PHP 5.4以降でのみ有効であり、古いバージョンではサポートされていません。
session_write_close()を明示的に呼び出した場合、 session_register_shutdown()を呼び出してもマイナスの影響はありませんが、繰り返し呼び出す必要はありません。
この関数を使用した後、セッションが既に閉じられているため、セッションデータが記述されなくなっていることを確認してください。
session_register_shutdown()は、セッションシャットダウン操作を最適化および簡素化するための実用的な機能です。これは、長いスクリプトが実行され、同時リクエスト、およびセッションロジックをカプセル化するシナリオに特に適しています。クローズドコールバックを自動的に登録することにより、コードの退屈な操作と人間の過失を減らし、プログラムの堅牢性と並行性パフォーマンスを向上させることができます。