我正在研究一个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
错误消息,我想知道导致它被杀的原因是什么?
答案 0 :(得分:67)
您可能会触发Linux内存不足(OOM)杀手。查看dmesg
以获取有关它的消息。它说当发生这种情况时哪个进程被杀死了。
答案 1 :(得分:16)
重现此Killed
错误的简单方法:
我能够使用Ubuntu 12.10
在PHP 5.3.10
上重现此错误。
创建一个名为m.php
的PHP脚本并保存:
<?php
function repeat(){
repeat();
}
repeat();
?>
运行它:
el@apollo:~/foo$ php m.php
Killed
程序占用100%CPU约15秒,然后暂停Killed
消息。看看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”,因为它由于无限循环而耗尽内存。
<强>解决方案:强>
答案 2 :(得分:0)
在我的CloudLinux PHP 7.1上,它发生在两个进程无锁地读取和写入同一文件时。