我有一个脚本,用 PHP 编写,使用 AWS Dynamo PHP API。它运行一个长循环,从发电机中提取大量数据,然后对其进行处理。
当我使用“top”查看进程时,我可以看到“php”进程使用的内存使用情况
在我的脚本循环中,我打印 memory_get_usage(true) 的结果
当我运行测试时,这两个值甚至都不相似......
他们应该是吗?如果不是为什么不呢?
在我的测试中,我有一个 1.7gb 内存的服务器,我将 php.ini 的 memory_limit 设置为 64M。我还在脚本开始时调用 gc_enable(),并在每个循环之间调用 gc_collect_cycles(),希望强制进行垃圾回收。
当我使用 'top' 观看我的 php 脚本时,我可以看到 %MEM 不断上升,直到它最终超过 95% 并且 linux 杀死了 php 进程,我通过查看 'dmesg' 知道这一点。当我查看循环每次迭代的打印输出时,memory_get_usage(true) 报告的内存使用量永远不会超过 50mb。
Linux 认为脚本使用了将近 1.7gb,php 认为它只使用了 50mb!
怎么回事?
即使脚本有内存泄漏,我也不明白为什么 memory_get_usage(true) 不考虑内存...
更新
在花了一些时间注释掉我在循环中运行的处理的各个部分后,我发现如果我删除以下代码:
class cMyClass {
public static function static_cmp_fn(&$a, &$b) {
if ($a['att'] == $b['att']) { return 0; }
$ret = ($a['att'] < $b['att']) ? -1 : +1;
return $ret;
}
function DoProcessing(){
$sort_fn = array("cMyClass", "static_cmp_fn");
usort($this->m_dictToSort, $sort_fn);
unset($sort_fn);
}
}
php 永远不会吃掉所有的系统内存。在我看来,usort 正在泄漏内存,我不知道为什么。我不明白的是为什么 PHP 报告有关它正在使用多少内存的错误信息......
有任何想法吗?