PHP脚本中的通用“Killed”错误

我正在致力于一个CRON作业,调用一个PHP脚本,它可以处理很多循环的数据库。

当我限制数据集的时候,它会正确执行,但是当我对整个数据集运行它的时候,脚本会输出一条消息:

Killed 

set_time_limit是(0),memory_limit是(-1)

这是代码部分,它一直死亡:

 echo "I'm in _getMemberDemographicAttrs\n"; if (! empty ( $member_id )) { $query .= ' AND member_id = ' . $member_id; } $result = mysql_query ( $query, $this->_db ); if ($result) { while ( $rule = mysql_fetch_assoc ( $result ) ) { $rules [] = $rule; } if (! empty ( $rules )) { mysql_free_result ( $result ); echo "I'm leaving _getMemberDemographicAttrs\n"; return $rules; } } 

输出如下所示:

 I'm in _getMemberDemographicAttrs<br/> I'm leaving _getMemberDemographicAttrs<br/> I'm in _getMemberDemographicAttrs<br/> I'm leaving _getMemberDemographicAttrs<br/> I'm in _getMemberDemographicAttrs<br/> Killed 

我从来没有见过这个通用Killed错误消息,我想知道是什么造成它被杀害?

您可能会触发Linux内存不足(OOM)杀手。 检查dmesg的消息。 它说明在这种情况下哪个进程被杀死了。

简单的方法来重现这个Killed错误:

我能用Ubuntu 12.10 PHP 5.3.10Ubuntu 12.10上重现这个错误。

创build一个名为m.php的PHP脚本并保存它:

 <?php function repeat(){ repeat(); } repeat(); ?> 

运行:

 el@apollo:~/foo$ php m.php Killed 

该程序占用100%的CPU大约15秒,然后停止使用Killed消息。 看看dmesg | grep php dmesg | grep php和有线索:

 el@apollo:~/foo$ dmesg | grep php [2387779.707894] Out of memory: Kill process 2114 (php) score 868 or sacrifice child 

所以在我的情况下,PHP程序暂停并打印“Killed”,因为它由于无限循环而耗尽内存。

解决scheme:

  1. 增加此PHP程序可用的RAM数量或可用内存量。
  2. 将问题分解成按顺序运行的小块。
  3. 重写程序,使其具有较小的内存要求,或者不会像recursion那样深入。

如何不再遇到这个问题

如果你编写的代码导致了这个错误,并且你感到困惑,并且为什么这么做了,那么你需要重新访问PHP结构,循环和recursion的基本核心行为,以及如何分配内存以满足这些结构: http : //eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/