我将会话保存在/ temp目录的另一个目录中。
说/session
目录。(使用session_save_path("session")
)
此外,还有一个代码可以在创建和注销10分钟后终止会话。
但我提到如果用户登录并例如关闭他的计算机,我的注销和会话销毁代码剂量不会运行,因此会话文件将保留在会话目录中。
我想知道有一种方法可以在创建一段时间后删除/session
中的会话文件吗?
我使用了这段代码
if ($handle = opendir('sessions')) {
while (false !== ($file = readdir($handle))) {
if (filectime($file)< (time()-600)) { // 600 = 10*60
unlink($file);
}
}
}
但是,不工作,我认为它无法通过filectime($file)
谢谢
答案 0 :(得分:4)
你不应该那样做。 PHP本身实现了一个垃圾收集机制来删除已解散的会话文件。它将比使用PHP自己编写的任何其他内容更有效。
有关更多信息,请参阅PHP的session.gc_*配置选项。
答案 1 :(得分:4)
谢谢,但我想我可以自己解决它
解决方案很简单
if ($handle = opendir('sessions')) {
foreach (glob("sessions/sess_*") as $filename) {
if (filemtime($filename) + 400 < time()) {
@unlink($filename);
}
}
}
答案 2 :(得分:3)
之前我已经完成了一个cron作业,并删除了早于X的会话文件(出于某种原因,PHP的自动清理没有完成工作)。不幸的是,如果托管主机无法设置cron作业,那么这可能不是您的选择。
答案 3 :(得分:1)
// Delete old sessions
if (substr(ini_get('session.save_path'), 0, 4) != '/tmp') {
foreach (glob(rtrim(ini_get('session.save_path'), '/') .'/sess_*') as $filename) {
if (filemtime($filename) + ini_get('session.gc_maxlifetime') < time()) {
@unlink($filename);
}
}
}
答案 4 :(得分:0)
// get the session files directory
$dir = session_save_path("session");
//clear cache
clearstatcache();
// Open a directory, and read its contents
if (is_dir($dir)){
// we iterate through entire directory
if ($dh = opendir($dir)){
while (($file = readdir($dh)) !== false){
//get the last acces date of each file
@$time_stamp=fileatime($file);
//check if it is older than... 600, and assign a text flag: with value "to delete" (when old enough) or "---" (when young enough)
$to_delete = ($time_stamp<time()-600) ? 'to delete!' : '---';
//format acces date to a human readible format
@$date = date("F d Y H:i:s.",fileatime($file));
//output stats on the screen
echo "file:" . $file . "Last access: ".$date.", ".$to_delete."<br>";
//INFO
//depending on wishes, you can modify flow of the script using variables
// particulary useful is $to_delete -> you can easily covert it to true/false format
//to control the scrip
}
closedir($dh);
}
}