PHP 脚本中的一般“已杀死”错误

2022-08-30 10:12:36

我正在处理一个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


答案 1

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


答案 2

重现此已杀死错误的简单方法:

我能够使用 重现此错误。Ubuntu 12.10PHP 5.3.10

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

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

运行它:

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

该程序占用100%CPU约15秒,然后停止消息。看看,有线索:Killeddmesg | 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. 增加此 PHP 程序可用的 RAM 量或可用内存量。
  2. 将问题分解为按顺序运行的较小块。
  3. 重写程序,使其具有较小的内存要求,或者不会在递归中深入。

推荐