Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Session_Garbage Collection - Fatal编程技术网

PHP垃圾收集开始较晚

PHP垃圾收集开始较晚,php,session,garbage-collection,Php,Session,Garbage Collection,我想知道垃圾收集将在什么时候运行,所以我制作了下面的测试脚本 <?php ini_set('session.gc_maxlifetime',10); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); echo ini_get('session.gc_maxlifetime').'s '; echo ini_get('session.gc_probability').'/'; echo ini_ge

我想知道垃圾收集将在什么时候运行,所以我制作了下面的测试脚本

<?php

ini_set('session.gc_maxlifetime',10);
ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',1);

echo ini_get('session.gc_maxlifetime').'s ';
echo ini_get('session.gc_probability').'/';
echo ini_get('session.gc_divisor')."<br>";

session_start();
echo session_id();
if (isset($_SESSION['test']))
{
    echo "<br>";
    echo "session set";
}
$_SESSION['test'] = "works";
echo "<br>";
print_r($_SESSION);

?>
试试#2:我等了10多秒,得到:

10s 1/1
e9isrrljuvdbr1c6vqndp1e4i7
session set
Array ( [test] => works )
试试#3:然后在那之后的任何时候我都会得到:

10s 1/1
e9isrrljuvdbr1c6vqndp1e4i7
Array ( [test] => works )

为什么垃圾收集不是在try#2上启动,而是在try#3上启动?

针对会话数据的PHP垃圾收集旨在最终清理数据,而不是保证数据被清理

如果启动会话,PHP将尝试从上一个请求中查找已存储的会话数据。否则,它将假定会话是全新的,在磁盘上创建一个空会话文件,锁定它,并将$\u会话初始化为空阵列

在脚本结束时,或者调用
session\u write\u close()

只有这样,垃圾收集才有可能开始(即每100个请求中只有一个启动垃圾收集)。它扫描所有会话文件是否过期,如果文件上次修改时间比
session.gc\u maxlifest
设置早,它将被删除

实际上,
session.gc\u maxlifest
的标签是错误的。它实际上是
session.gc\u minlifetime
,因为会话数据至少存在这段时间

第二件事:垃圾收集不能丢弃您正在积极使用的会话,因为它的数据是新保存的

第三:垃圾收集需要一个请求来触发它。它不是后台的自动化过程

结合第二点和第三点会导致垃圾收集,只清除比
session.gc\u maxlifest
旧的其他会话。要测试它,至少需要两个会话,一个会话过期,第二个会话触发执行垃圾收集


所以它应该是这样的:有两个浏览器,用这两个浏览器访问会话页面。定期在一个浏览器中重新加载页面,在第二个浏览器中等待超过
session.gc\u maxlifest
秒。然后在第二个浏览器中重新加载-会话应该消失。

看起来像是
session\u start()
读取会话,并且只有在该会话运行之后,才会从文档中读取会话。
在会话启动期间可能会发生垃圾回收…
为什么它会在读取会话后删除会话?这太疯狂了,尽管看起来它实际上就是这么做的。最精确的答案可以给一些对php源代码有足够信心的人。我们只能猜测:-)session.gc_minlife确实更有意义。但是文档中说,
垃圾收集可能发生在会话启动期间(取决于session.gc\u概率和session.gc\u除数)。
但是上面您声称垃圾收集发生在脚本末尾。您还声称会话不能触发它自己的垃圾收集,但try#3表明这不是真的。
10s 1/1
e9isrrljuvdbr1c6vqndp1e4i7
Array ( [test] => works )