【发布时间】:2015-03-11 01:18:00
【问题描述】:
最近我开始面对 PHP 中的内存管理问题。这对我来说是新事物,因为我不需要在后台线程上长时间运行 PHP 脚本。因此,现在我正在研究该主题并得出以下简单脚本:
function w()
{
$f = fopen('test1.txt', 'w+');
fclose($f);
unset($f);
}
$i = 0;
$max = 5;
echo 'Memory usage:<br><br>';
echo $i . ' - ' . memory_get_usage() . '<br>';
touch('test1.txt');
while(++$i < $max)
{
w();
echo $i . ' - ' . memory_get_usage() . '<br>';
}
它只会多次打开和关闭同一个文件,每次关闭后都会显示使用的内存。
如您所见,即使在关闭和取消设置处理程序之后,内存也不会下降。似乎在内部指针仍在保存内存。我知道,它们只有几个字节,但如果脚本在后台线程上运行,即使是几个字节也会破坏脚本(这是我的真正目的)。
我尝试设置 $f = null 但它会消耗更多内存(我没疯,请自己检查)!而且 gc_collect_cycles() 也不起作用。
所以我的问题是:有没有办法完全释放文件处理程序的内存?
【问题讨论】:
-
我只是重试了上面的脚本,没有改变内存。它第一次改变,然后在 261 次之后,然后保持静止,最多 5000 个循环。
-
是的,我也注意到了这一点,但在实际情况下,每次运行时我都会打开许多文件。因此,内存使用量会增长,直到脚本中断。对我来说奇怪的是,即使关闭处理程序,内存也不会下降。
-
您可能没有看到内存下降,因为 PHP 是垃圾收集器,并且垃圾收集器仅在您有空闲 CPU 时间(例如,如果您调用
sleep())或内存不足时运行- 以先到者为准。由于您没有内存不足并且没有让 CPU 休息一下,因此垃圾收集器没有运行,因此您没有释放内存。
标签: php file memory fopen fclose