代码之家  ›  专栏  ›  技术社区  ›  Pro777

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

  •  47
  • Pro777  · 技术社区  · 15 年前

    我正在处理一个cron作业,它调用一个PHP脚本,该脚本使用循环来处理大量数据库工作。

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

    Killed
    

    设置时间限制为(0),内存限制为(-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 回复  |  直到 6 年前
        1
  •  65
  •   Steve Madsen    15 年前

    您可能触发了Linux内存不足(OOM)杀手。检查 dmesg 关于它的信息。它指出了当这种情况发生时,哪个进程被终止了。

        2
  •  14
  •   Eric Leschinski Yashu Seth    9 年前

    简单的复制方法 Killed 错误:

    我可以在 Ubuntu 12.10 具有 PHP 5.3.10 .

    创建一个名为 m.php 拯救它:

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

    运行它:

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

    程序需要100%的CPU大约15秒,然后用 被杀死的 消息。看 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. 增加此PHP程序可用的RAM数量或可用内存数量。
    2. 把问题分解成按顺序操作的小块。
    3. 重写程序,使其具有较小的内存需求,或者不使用递归进行如此深入的操作。

    如何避免这个问题再次出现

    如果您编写的代码导致了这个错误,并且您觉得自己陷入了困境,不知为什么要这样做,那么您需要重新访问PHP结构、循环和递归的基本核心行为,以及如何分配内存来满足这些构造: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

        3
  •  0
  •   Boy    6 年前

    在我的cloudlinux(php 7.1)上,当两个进程在不加锁的情况下读写同一个文件时,就会发生这种情况。