【发布时间】:2026-02-20 13:30:02
【问题描述】:
我有一个 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);
}
以及如何减少内存使用量?如果我需要使用这么多查询、变量等。
附:代码不是我的:)我也不想从头重写,我只是在寻找优化方向。
没有变量清理内存使用是下一个(它在每次迭代开始时测量)
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 的工具可以帮上忙,去试试吧:)
【问题讨论】:
-
如果你在 unset 后使用 memory_get_peak_usage(true) 来测试你的内存使用情况,并且它似乎没有下降;那么线索就在PEAK这个词中
-
@MarkBaker 我尝试使用简单的 memory_get_usage() 图片在每次迭代中内存使用量都在增长
标签: php optimization