PHPでは、 session_register_shutdown()は、セッションのクローズバックを登録するために使用される関数です。その主な機能は、セッションデータが正しく保存されることを確認して、スクリプト実行の最後にsession_write_close()を自動的に呼び出すことです。ただし、実際の使用中に、多くの開発者がSession_register_shutdown()が有効にならないという問題に遭遇し、セッションが正常に書かれていないか、保存に失敗します。この記事は、この問題のトラブルシューティングと解決に役立つ一般的な構成アイテムと使用状況の詳細から開始されます。
session_register_shutdown()は、php 5.4.0の後に導入された関数です。スクリプトの最後にsession_write_close()を自動的に呼び出すコールバックを登録するために使用されます。これにより、開発者がsession_write_close()を手動で呼び出さないようにすることができ、セッションデータがそれを呼び出すのを忘れていないために書かれていないという問題を防ぎます。
<?php
session_start();
session_register_shutdown();
$_SESSION['user'] = 'Alice';
// スクリプトの最後に,session 自動的に記述されます
?>
主な理由は次のとおりです。
この関数は、PHP 5.4.0でのみサポートされています。以前のバージョンのPHPを使用している場合、有効になりません。
一部の環境では、この機能を無効にしている場合があります。Disabled_Functionsの構成を確認してください。
session.auto_startが有効になると(1の値)、PHPは自動的にセッションを開始します。セッションのライフサイクルが自動開始によって制御されているため、この時点でsession_register_shutdown()を呼び出すことは無効です。
この構成をオフにすることをお勧めします:
session.auto_start = 0
コードまたはフレームワークがそれ自体でsession_write_close()を呼び出してから登録するためにsession_register_shutdown()と呼ばれている場合、実行する機会はありません。
環境がsession_register_shutdown()をサポートしていることを確認するために、次の順序でPHPの構成を確認してください。
<?php
// チェック PHP バージョン,しなければならない >= 5.4.0
echo 'PHP Version: ' . phpversion();
// チェック disable_functions 構成,関数が無効になっていないことを確認してください
echo 'Disabled functions: ' . ini_get('disable_functions');
// チェック session.auto_start,閉じることをお勧めします
echo 'session.auto_start: ' . ini_get('session.auto_start');
// チェック session.save_handler,一般的に files
echo 'session.save_handler: ' . ini_get('session.save_handler');
// サンプル検出コード
if (function_exists('session_register_shutdown')) {
echo "session_register_shutdown() 利用可能\n";
} else {
echo "session_register_shutdown() 不利用可能\n";
}
?>
PHPを5.4.0以上にアップグレードします。
php.iniに設定:
session.auto_start = 0
または、セッションがコードの先頭に自動的に有効になっていないことを確認してください。
プログラムロジックでは事前にセッションが閉じられていないことを確認してください。 session_register_shutdown()を使用した後、 session_write_close()を手動で呼び出す必要はありません。
<?php
// 正しく使用してください session_register_shutdown
session_start();
session_register_shutdown();
$_SESSION['user'] = 'Bob';
// ここでは手動電話は必要ありません session_write_close()
echo "Session 写入将在スクリプトの最後に自动完成。";
?>