PHPでは、 Session_register_shutdown()関数を使用して、セッションが閉じたときに自動的に実行されるコールバック関数を登録します。理論的には、スクリプトが実行されたときにセッションデータを自動的に保存するのに役立ちます。ただし、実際に使用すると、多くの開発者が問題に遭遇しています。Session_register_shutdown ()が呼び出されたとしても、セッションデータは自動的に保存できず、セッション情報が失われたり、タイムリーな更新が行われます。
この記事では、この問題の根本原因を詳細に分析し、セッションの自動保存を正しく処理するのに役立ついくつかの実行可能なソリューションを提供します。
session_register_shutdown()は、実際には比較的低レベルの関数です。 PHPがセッションを閉じてセッションデータを保存すると、 SESSION_WRITE_CLOSE()を自動的に呼び出します。ただし、PHP 5.4から始めて、この関数は廃棄されたものとしてマークされ、一部の環境では不安定であると機能しています。特に、スクリプトにsession_write_close()または出力バッファ関連操作に早期に呼び出される場合、 session_register_shutdown()は通常、保存アクションをトリガーできません。
さらに、 SESSION_REGISTER_SHUTDOWN()は、セッションが閉じられているときにのみSESSION_WRITE_CLOSE()を自動的に呼び出します。開発者がコードでsession_write_close()を積極的に呼び出した場合、後続の呼び出しの効果は無視され、セッションが正しく記述されません。
session_register_shutdown()が非推奨であることを考えると、 session_write_close()と直接組み合わせてregister_shutdown_function()を使用して、スクリプトが終了したときにセッションが手動で呼び出されるようにすることをお勧めします。
サンプルコード:
<?php
session_start();
// スクリプトの最後に手動で保存します session
register_shutdown_function(function() {
session_write_close();
});
// 改訂 session データ
$_SESSION['user'] = 'チャン・サン';
echo "Session セット";
?>
ここで重要なのは、 register_shutdown_function()を使用することです。これは、スクリプトの実行後に匿名関数を呼び出すため、 session_write_close()が呼び出され、セッションデータが正しく保存されるようにします。
session_write_close()がスクリプトの他の部分で呼び出されている場合、 register_shutdown_function()またはsession_register_shutdown()への呼び出しが無効になる場合があります。繰り返しの呼び出しを避けるために、コードをチェックする必要があります。
たとえば、次のコードにより、セッションが自動的に保存されなくなります。
<?php
session_start();
session_write_close(); // 早めに閉じた session
// 登録が終了したときに呼び出されます,実際、それは二度と発効しません
session_register_shutdown();
$_SESSION['user'] = 'li si';
echo "Session おそらく保存されていません";
?>
正しい方法は、事前に閉じられているsession_write_close()を削除することです。
<?php
session_start();
session_register_shutdown();
$_SESSION['user'] = 'li si';
echo "Session 保存";
?>
ただし、廃棄された機能の使用を避けるために、ソリューション1の執筆方法に変更することをお勧めします。
多くのシナリオでは、コードの終了の直前にsession_write_close()を呼び出すことも安定した簡単なアプローチです。
<?php
session_start();
$_SESSION['cart'][] = '商品A';
// すべてのビジネスロジックを処理した後,マニュアルライティング session
session_write_close();
echo "ショッピングカートが更新されました";
?>
この方法はより互換性があり、自動登録に依存する複雑さを回避します。
PHPセッション処理の詳細については、公式ドキュメントを参照してください。
<a href="https://m66.net/manual/zh/function.register-shutdown-function.php">PHP 正式 register_shutdown_function() 書類</a>
関連タグ:
session