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

Pro*_*777 49 php mysql cron

我正在开发一个CRON作业,它调用一个PHP脚本,它使用循环执行大量数据库工作.

当我限制数据集时它会正确执行,但是当我针对完整数据集运行它时,脚本会出错并显示一条消息:

Killed
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这个通用的Killed错误信息,我想知道导致它被杀的原因是什么?

Ste*_*sen 70

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

  • 谢谢你.我发现Linux正在扼杀这个过程.我通过减少脚本中PHP的内存限制来解决它,这允许PHP以不同方式管理其内存并避免崩溃. (3认同)

Eri*_*ski 16

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

我能够重现这个错误Ubuntu 12.10PHP 5.3.10.

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

<?php
    function repeat(){
       repeat();
    }
    repeat();
?>
Run Code Online (Sandbox Code Playgroud)

运行:

el@apollo:~/foo$ php m.php
Killed
Run Code Online (Sandbox Code Playgroud)

程序占用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
Run Code Online (Sandbox Code Playgroud)

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

解决方案:

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