PHPでは、 Session_register_shutdown()関数を使用して、セッションが閉じたときに実行されたコールバック関数を登録し、スクリプト実行の最後にセッションを保存および閉じることができることを確認することを目的としています。ただし、多くの開発者は、関数が実行されない状況に遭遇し、セッションデータが正しく保存またはリリースされないようになります。この記事では、この問題に焦点を当て、可能な5つの一般的な原因を分析し、PHPコードの例と併せて説明します。
session_register_shutdown()関数は、php 5.4.0以降導入されました。 5.4未満のPHPバージョンを使用している場合、関数はまったく存在せず、それを呼び出すことは当然有効ではありません。
<?php
// PHPバージョン判断の例
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
echo "現在PHPバージョンはサポートされていませんsession_register_shutdown()関数。";
}
?>
PHPバージョンをアップグレードするか、互換性のあるセッション管理方法を採用することをお勧めします。
session_register_shutdown()は、セッションが開始された後にコールバック関数を登録する必要があります( session_start() )。セッションが開始されない場合、登録操作は有効になりません。
<?php
session_start(); // セッションを最初に開始する必要があります
session_register_shutdown(function() {
// セッションが閉じられたときに実行されるアクションは次のとおりです
error_log("Session閉鎖,コールバックを実行します");
});
?>
関数を登録する前に、 session_start()が呼び出されることを確認してください。
session_register_shutdown()は、パラメーターなしでコールバック関数を受け入れます。着信コールバック関数パラメーターが要件を満たしていない場合、関数は実行されません。
<?php
session_start();
session_register_shutdown(function() {
// 正しいパラメーターレスコールバック
error_log("Session閉鎖,正しいコールバック");
});
?>
パラメーターまたは誤ったコールバック宣言を使用して匿名関数を使用しないでください。
複数のsession_write_close()呼び出しがコードに存在する場合、またはその他のフレームワーク/ライブラリがセッションの終了プロセスを変更する場合、 session_register_shutdown()が登録したコールバック関数は実行されない場合があります。
<?php
session_start();
session_register_shutdown(function() {
error_log("埋め込むsession閉鎖回调");
});
// 这里不要提前閉鎖会话
// session_write_close(); // 事前に呼び出された場合,会导致注册的回调不埋め込む
?>
セッションを手動で閉じるのは早すぎて、コールバックコールに影響を及ぼさないでください。
スクリプトの実行中に致命的なエラーが発生した場合、 exit() / die()が事前に呼び出された場合、登録セッションクロージングコールバックは実行されない場合があります。
<?php
session_start();
session_register_shutdown(function() {
error_log("回调埋め込む成功");
});
// スクリプトの例外または早期終了
// exit; // 如果埋め込むexit,登録されたコールバックはトリガーされません
?>
スクリプトがエラー処理メカニズムを通じて通常終了すること、または重要なプロセスで出口ステートメントの使用を避けることをお勧めします。
session_register_shutdown()は非常に便利な機能ですが、使用する場合は上記の5つのポイントに注意を払う必要があります。
PHPバージョンは≥5.4でなければなりません
セッションを開始する必要があります
コールバック関数にはパラメーターが必要です
セッションの早期閉鎖は避けてください
スクリプトの例外の中断を避けてください
これらの条件が満たされた場合にのみ、 session_register_shutdown()を正常に実行して、セッションが閉じられたときに完全なビジネスロジックを確保できます。