我有一个 PHP 脚本,其中包含一个大型的人员数组,它通过 SOAP 从外部资源获取其详细信息,修改数据并发送回来。由于详细信息的大小,我将 PHP 的内存升级到了 128MB。运行约 4 小时后(可能需要 4 天才能完成),它耗尽了内存。以下是它的基本功能:
$people = getPeople();
foreach ($people as $person) {
$data = get_personal_data();
if ($data == "blah") {
importToPerson("blah", $person);
} else {
importToPerson("else", $person);
}
}
运行过程中出现内存耗尽并崩溃后,我决定在
foreach
循环之前初始化$data,并根据top
的显示,该进程的内存使用率未超过7.8%,已持续运行12小时。那么我的问题是,即使重复使用,PHP是否不会对在循环内部初始化的变量运行垃圾收集器?系统是否正在回收内存,并且PHP尚未将其标记为可用,最终会再次崩溃(我现在已将其增加到256MB,因此我更改了2个设置,但不确定哪个修复了问题,我可以更改脚本以回答这个问题,但不想再等待12个小时才能崩溃)?
我没有使用Zend框架,因此我认为与此类似的其他问题并不相关。
编辑:实际上,我没有关于脚本或其功能的问题。目前,就所有系统报告而言,我并没有任何问题。这个问题是关于垃圾收集器及其如何/何时在foreach循环中回收资源以及/或者系统如何报告php进程的内存使用情况。
importToPerson()
函数中会发生什么? - PeeHaaif ($data = "blah") {
应该改为if ($data == "blah") {
吗? - PeeHaa