PHP脚本中的通用“已杀死”错误

时间:2009-06-04 20:20:03

标签: php mysql cron

我正在研究一个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错误消息,我想知道导致它被杀的原因是什么?

3 个答案:

答案 0 :(得分:67)

您可能会触发Linux内存不足(OOM)杀手。查看dmesg以获取有关它的消息。它说当发生这种情况时哪个进程被杀死了。

答案 1 :(得分:16)

重现此Killed错误的简单方法:

我能够使用Ubuntu 12.10PHP 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”,因为它由于无限循环而耗尽内存。

<强>解决方案:

  1. 增加可用的RAM量或此PHP程序可用的内存量。
  2. 将问题分解为按顺序运行的较小块。
  3. 重写程序,使其具有较小的内存要求,或者在递归时不会那么深。

答案 2 :(得分:0)

在我的CloudLinux PHP 7.1上,它发生在两个进程无锁地读取和写入同一文件时。

相关问题