我有 php 应用程序应该管理(导出)大量(大量)数据,并且必须在生产中完成......所以我需要尽可能低的内存使用量(主要标准)。
简单说一下App循环导出数据,比如
for($fileCounter=0;$fileCounter<=70;$fileCounter++) {
... HERE a lot of (more than 1K lines) huge work, many variables a lot of DB queries from another databases etc ...
}
我不想在这里展示完整的逻辑,因为对其他人来说可能需要很多时间,这不是这里的重点。
要点是,为什么如果我unset()
在每次迭代期间将所有新创建的变量都不会减少内存使用量?像这样
for($fileCounter=0;$fileCounter<=70;$fileCounter++) {
// optimization purpose
$vars_at_start = array_keys(get_defined_vars());
echo memory_get_peak_usage(true) . PHP_EOL;
... huge logic ...
$vars_at_end = array_diff($vars_at_start, array_keys(get_defined_vars()));
foreach($vars_at_end as $v) unset($v);
unset($vars_at_end);
}
以及如何减少内存使用量?如果我需要使用这么多查询、变量等。
PS代码不是我的:)我不想从头重写它,我只是在寻找优化方向。
接下来是没有变量清理内存使用情况(它在每次迭代开始时测量)
23592960
Started: 0 - 12:58:26
Ended: 13:00:51
877920256 (difference 854'327'296)
Started: 1 - 13:00:51
Ended: 13:03:39
1559494656 (difference 681'574'400)
和变量清洗
23592960
Started: 0 - 12:47:57
Ended: 12:50:20
877920256 (difference 854'327'296)
Started: 1 - 12:50:20
Ended: 12:53:16
1559756800 (difference 681'836'544)
根据我的阅读,PHP 有很多理由泄漏内存......就像这样https://bugs.php.net/bug.php?id=48781
有一个叫做 valgrind 的工具可以提供帮助,去试试吧:)