Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 它是如何工作的_Php - Fatal编程技术网

Php 它是如何工作的

Php 它是如何工作的,php,Php,具有此会话设置: @ini_set('session.gc_probability', 1); @ini_set('session.gc_divisor', 1); @ini_set('session.gc_maxlifetime', 60); session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc'); function _s

具有此会话设置:

@ini_set('session.gc_probability', 1);
@ini_set('session.gc_divisor', 1);
@ini_set('session.gc_maxlifetime', 60);
  session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
 function _sess_gc($maxlifetime) {
      echo "GC started";
  }

据我所知,在这种设置下,垃圾收集器应该每60秒运行一次(因为概率和除数是相同的)。我现在正在测试这个,奇怪的是每次我刷新网站时GC都会运行,它不会等到上一次调用过了60秒。这让我有点困惑,我理解这里有什么错误吗?

session.gc\u概率/session.gc\u除数=x

在你的例子中,x=1。(=100%的机会)

这意味着垃圾收集器将在每个请求上运行。这是任何人提出的每一个要求

垃圾收集器将只删除过时且符合删除条件的会话文件,而不删除最近修改的文件。
被认为是过时的是由会话定义的。gc_maxlife并不总是在每个请求上运行,默认的PHP设置是运行gc的几率为1%<代码>会话.gc_概率(默认值1)/
会话.gc_除数
(默认值100)=0.01(1%概率)

相关手动输入:

我的建议是存储上次触摸会话的时间,并在每次页面加载时对照该值进行检查,如果经过足够的时间,
session\u销毁
,并将用户重定向到登录页面

我认为你也应该尝试在你开始你的课程后,在你的公开课中加入这个。在
session\u start()之后
行添加

session_write_close();//将$\u会话转储到文件,关闭文件,释放锁。


看看这些措施是否也能改善您的状况。

好的。但究竟哪些会话文件将被删除?我的会话数据存储在数据库中。我有自己的清理函数,比如:函数_sess_gc($maxlifest){DB::exec(“从表_sessionwhereexpiry<”.time();)中删除)。因此,如果这个函数运行每个页面请求,那么这个gc_maxlife对我来说没有任何意义。如果你正在使用自己的会话存储(比如在数据库中),那么你发布的垃圾收集是无用的。建立你自己的。只需在数据库中添加一个时间戳,并在更新会话时进行更新。然后添加一些代码,有时会清理表,查找旧会话。你必须自己实现这一点。所以:只需在_sess_gc函数中添加一些删除旧记录的代码即可。是的,但并非所有的gc函数都是无用的。我使用gc_除数和gc_概率来设置如何运行_sess_gc函数。只有我自己设定的到期日,而不是基于gc_maxlifetime。或者,我可以按照您建议的方式进行操作,即在保存会话时检查会话时间戳。