PHP脚本中的一般“Killed”错误

Posted

技术标签:

【中文标题】PHP脚本中的一般“Killed”错误【英文标题】:Generic "Killed" error in PHP script 【发布时间】:2010-10-31 11:20:35 【问题描述】:

我正在做一个调用 php 脚本的 CRON 作业,该脚本使用循环执行大量数据库工作。

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

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 错误消息,我想知道是什么导致它被杀死?

【问题讨论】:

我刚刚在 PHP 7.4 上遇到了这个错误,罪魁祸首是一个匿名类,它覆盖了一个方法。我在父类的基方法中添加了一个参数,但在匿名子类中忘记了参数。由于某种原因,PHP 没有正确解析这个并占用内存,直到 OOM 杀手 Killed 进程。将缺少的参数添加到 anon 类解决了这个问题。老实说,这听起来像是 PHP 中的一个错误。 【参考方案1】:

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

【讨论】:

谢谢。我发现Linux正在杀死该进程。我通过减少脚本中 PHP 的内存限制来解决它,这允许 PHP 以不同的方式管理其内存并避免崩溃。 谢谢。正是我需要的。 对我来说,问题是通过从 PHP 5.6 升级到 PHP 7 解决的。显然这取决于许多因素,但 PHP 7 的工作效率更高,因此值得一试。 对我来说,我正在运行 PHP7,但我已经被杀死了,尽管我有 3GB 的可用内存!并且PHP内存限制设置为-1,我正在尝试@Fuser97381解决方案。【参考方案2】:

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

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

解决方案:

    增加此 PHP 程序的可用 RAM 量或可用内存量。 将问题分解为按顺序运行的较小块。 重写程序,使其具有更小的内存需求或递归不那么深。

【讨论】:

【参考方案3】:

在我的 CloudLinux PHP 7.1 上,它发生在 2 个进程在没有锁的情况下读取和写入同一个文件时。

【讨论】:

以上是关于PHP脚本中的一般“Killed”错误的主要内容,如果未能解决你的问题,请参考以下文章

错误处理

PHP 的错误级别

PHP的错误知识

PHP 内置 Web 服务器和路由器脚本中的语法错误

“SQLSTATE[HY000]: 一般错误” - 一条语句中有多个 SQL 查询

PHP常见报错解析