私が理解しているsession_set_save_handlerの実行順序メカニズム
デフォルトのセッションhandler起動順序
運転後は下図のようになります.
デフォルトはセッション_startがそれぞれ呼び出すコールバック関数.Open readのために、スクリプトの終了を待って
デフォルトセッションコールバック順序の変更
では、
では、
winプラットフォームに残された問題(テスト解決済み)
ps:winでテストされているため、gcの回収が正確ではない可能性があります.私が1:1に設定しても、100%回収することが含まれています.winにはまだこの
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_probability
とsession.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とは異なる.