現在の位置: ホーム> 最新記事一覧> ユーザーページが閉じた後、Session_register_shutdown関数を使用してセッションデータを安全に保存する方法は?

ユーザーページが閉じた後、Session_register_shutdown関数を使用してセッションデータを安全に保存する方法は?

M66 2025-06-23

PHPを使用してWebアプリケーションを構築する場合、セッションデータの管理と保存が重要な部分です。通常、ユーザーがブラウザまたはページを閉じても、セッションデータを適切に保存してデータの一貫性とセキュリティを確保できることを願っています。 session_register_shutdown()関数は、この目的のために存在するツールです。

session_register_shutdownとは何ですか?

session_register_shutdown()は、スクリプトが実行されたときにsession_write_close()を自動的に呼び出すためにPHPによって提供される組み込み関数です。これにより、スクリプトが正常に終了するか、予期せずに中止されるかに関係なく、現在のセッションデータをサーバーに安全に書き込むことができます。

デフォルトでは、PHPはスクリプトの実行後にセッションデータを自動的に保存します。ただし、場合によっては、 Register_shutdown_function()が有効になり、セッション操作が呼び出される場合、またはスクリプトがexit()die()などの機能を中央で呼び出す場合、セッションデータは正しく保存されない場合があります。現時点では、 session_register_shutdown()を使用することが特に重要です。

それを使用する方法は?

非常に簡単に使用できます。 session_start()を呼び出した後、 session_register_shutdown ()に電話する必要があります。

 <?php
session_start();
session_register_shutdown();

// 例:ユーザーの訪問を増やします
if (!isset($_SESSION['views'])) {
    $_SESSION['views'] = 1;
} else {
    $_SESSION['views']++;
}

echo "あなたは最初です {$_SESSION['views']} 今回はこのページにアクセスしてください。";
?>

上記のコードは、ページがどのように閉じていても、セッションデータを保存できることを保証します(通常の閉鎖、異常な終了など)。

カスタムシャットダウン関数を登録します

いくつかの高度なシナリオでは、ユーザーの動作ログのログやクリーニングリソースなどのカスタムシャットダウン関数を登録できます。現時点では、 SESSION_REGISTER_SHUTDOWN()を呼び出すことは、 register_shutdown_function()と協力してセッションの損失を防ぐことができます。

 <?php
session_start();
session_register_shutdown();

register_shutdown_function(function () {
    // ログをリモートサーバーに記録します
    file_get_contents("https://m66.net/log?uid=" . urlencode($_SESSION['user_id']));
});

// 普通 session 論理
$_SESSION['last_action'] = time();
?>

上記のように、ユーザーのアクションレコードはhttps://m66.net/logに送信されます。これは、ページを閉じる前にユーザーの最後の動作をキャプチャするのに役立ちます。

注意すべきこと

  1. session_register_shutdown()は、セッションが有効になっている場合にのみ有効ですので、 session_start()に電話してください。

  2. シャットダウン関数のセッションデータを変更することはお勧めしません。シャットダウン段階は、主に外部リソースの読み取りまたは書き込みに適しています。

  3. この関数は、PHP 7+バージョンで有効であり、以前のバージョンでは利用できなかった可能性があります。

結論

session_register_shutdown()は、単純だが非常に実用的な機能であり、特にデータの一貫性の要件が高いアプリケーションシナリオに適しています。それを正しく使用することにより、偶発的なページの閉鎖によって引き起こされるセッションデータ損失の問題を効果的に回避することができ、それによりユーザーエクスペリエンスとシステムの堅牢性が向上します。