【发布时间】:2021-02-11 11:40:49
【问题描述】:
我最近一直在测试与记忆相关的东西。仔细阅读:
$data = load_in_huge_file('test.csv');
while (1)
{
var_dump(memory_get_usage(false));
var_dump(memory_get_usage(true));
sleep(4);
unset($data);
}
对于第一个循环,这会为第一次调用 memory_get_usage 和第二次输出一个巨大的值。
对于第二个(以及更进一步的)循环,这会为第一次调用 memory_get_usage 输出一个小值,而为第二个调用输出一个巨大值。
这意味着实际“分配”的内存保持不变,即使我取消设置保存所有数据的变量。
如果我这样做,也会发生同样的事情:
$data = load_in_huge_file('test.csv');
while (1)
{
var_dump(memory_get_usage(false));
var_dump(memory_get_usage(true));
sleep(4);
unset($data);
gc_collect_cycles();
}
分配的“真实”内存在分配后保持不变,并没有“释放”。
(load_in_huge_file 函数基本上运行 fopen blabla 后跟 fclose。)
我该怎么办?似乎 PHP 仍然“使用”内存,而我的重型 PHP CLI 脚本最终在处理许多 CSV 文件时耗尽了我所有的内存,并且内存没有被返回。
我想我根本不明白gc_collect_cycles() 做了什么。该手册至少可以说不清楚。
也许 unset() 就足够了,但它“需要一些时间”?也许“真实”分配的内存只是令人困惑的术语,并不意味着 RAM 被“占用”?
(关于计算机的一切永远都让我感到困惑。没有任何东西可以真正学到,除非每个细节都有无穷无尽的额外复杂层。)
【问题讨论】:
-
PHP 不分配 RAM。它分配内存,操作系统的工作是确定该内存的哪些部分占用 RAM,哪些不占用。也就是说,PHP 有一个不确定的垃圾收集器,它会随着内存压力的增加而运行。除非你有真正的问题,否则你不需要做任何事情。
标签: php windows memory-management command-line-interface ram