つまりね。私の同僚は、私たちが使用しているフレームワークのセッション処理を上書きしようとしています。このフレームワークはデフォルトでPHP独自のネイティブセッション処理を使用しますが、彼は現在、リクエスト間にデータベースレイヤーを実装しようとしています。
問題は、セッションが書き込まれるまでにデータベースオブジェクトが使用できなくなることですが、セッションからデータが読み取られるときなど、他の機能には使用できます。これはワイルドな振る舞いです。これが私たちがしたことです:
register_shutdown_function('exithandler');
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
これらの各関数は、関数の名前で追跡できる1行をログファイルに書き込みます。これは、関数が呼び出されるたびに実行されます。ここで、要求される2つのURLを示します。1つはセッションが実際に書き込まれる場所(セッションへの新しいデータ)で、もう1つはセッションデータがチェックされるだけの場所(何も書き込まれない)です。これがパズルです:
/login/
sess_open
sess_read
exithandler
sess_write
sess_close
/account/
sess_open
sess_read
sess_write
sess_close
exithandler
この動作が異なるのはなぜですか?データがセッションに保存される前にexitハンドラーが呼び出されるのはなぜですか。また、同じメソッドが実際に呼び出されたとしても、通常のページでは同じことが当てはまらないのはなぜですか。
問題は、exithandlerが呼び出された後、どのクラスも使用できなくなることです。PHPガベージコレクターがすべてのクラスで__destruct()メソッドを呼び出し、それらがなくなったと思います。これは悪いことです。
PHPがこのように動作する理由を知っている人はいますか?