私が理解しているsession_set_save_handlerの実行順序メカニズム


デフォルトのセッションhandler起動順序
savePath = $savePath;
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        echo __FUNCTION__."
"; return true; } function close() { echo __FUNCTION__."
"; return true; } function read($id) { echo __FUNCTION__."
"; return (string)@file_get_contents("$this->savePath/sess_$id"); } function write($id, $data) { echo __FUNCTION__."
"; return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true; } function destroy($id) { $file = "$this->savePath/sess_$id"; if (file_exists($file)) { unlink($file); } echo __FUNCTION__."
"; return true; } function gc($maxlifetime) { foreach (glob("$this->savePath/sess_*") as $file) { if (filemtime($file) + $maxlifetime < time() && file_exists($file)) { unlink($file); } } echo __FUNCTION__."
"; return true; } function end(){ echo ' register_shutdown_functiond '."
"; } } $handler = new FileSessionHandler(); session_set_save_handler( array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc') ); // register_shutdown_function(array($handler,end)); session_start(); $_SESSION['name']='tb'; // session_commit(); // session_write_close(); // , open read (gc) write close // session_destroy(); // session_regenerate_id(true);

運転後は下図のようになります.
デフォルトはセッション_startがそれぞれ呼び出すコールバック関数.Open readのために、スクリプトの終了を待って$_SESSION(デフォルトはメモリ)を収集し、スクリプトを閉じてwriteを実行し、ファイルに書き込み、closeを実行します.
デフォルトセッションコールバック順序の変更
では、session_commit();またはsession_write_close();関数を使用して呼び出すと、sessionのメカニズムが変わり、直接ファイルに書き込み、ファイルを閉じます.次にスクリプトを実行します.次の図に示します.
では、session_dessoryが呼び出されると、readの後になります.sesson_startが開く限り、先に実行されるのはopenとreadです.ではgcは、session.gc_probabilitysession.gc_divisorのパラメータに基づいて制御されていることを知っています.この例では、彼らの割合を5に設定しましたが、現在の問題は、5+回をリフレッシュしてもgcを呼び出すことができない可能性があります.私のwinプラットフォームと関係があるかもしれません.gcがヒットし、session_commit();またはsession_write_close();関数が呼び出されていない場合、実行フローは次の図に示されます.
winプラットフォームに残された問題(テスト解決済み)
ps:winでテストされているため、gcの回収が正確ではない可能性があります.私が1:1に設定しても、100%回収することが含まれています.winにはまだこのsessionidファイルが存在します.sessionロックメカニズムのためかもしれません.linuxでテストしてから共有します.またsessionの関連もこの問題を参照して明らかにしたが、php Session gcメカニズムの下でwindowの下でuntuとは異なる.