Общая ошибка Killed в скрипте PHP

Я работаю над заданием 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, и мне интересно, что вызывает его уничтожение?


person Pro777    schedule 04.06.2009    source источник
comment
Я только что получил эту ошибку на PHP 7.4, и виновником был анонимный класс, который переопределяет метод. Я добавил параметр к базовому методу в родительском классе, но забыл параметр в анонимном дочернем классе. По какой-то причине PHP не разобрал это правильно и перегрузил память до тех пор, пока убийца OOM Killed не завершит процесс. Добавление отсутствующего параметра в класс anon устранило проблему. Звучит как ошибка в PHP, если честно.   -  person ojrask    schedule 22.12.2020


Ответы (3)


Возможно, вы запускаете убийцу нехватки памяти (OOM) в Linux. Проверьте dmesg на наличие сообщений об этом. В нем говорится, какой процесс был убит, когда это происходит.

person Steve Madsen    schedule 04.06.2009
comment
Спасибо за это. Я обнаружил, что Linux убивает процесс. Я решил эту проблему, уменьшив лимит памяти для PHP в скрипте, что позволило PHP по-другому управлять своей памятью и избежать сбоя. - person Darth Egregious; 22.08.2012
comment
Спасибо. Как раз то, что мне было нужно. - person marlar; 03.04.2013
comment
Для меня проблема была решена путем обновления с PHP 5.6 до PHP 7. Очевидно, это зависит от многих факторов, но PHP 7 работает эффективнее, поэтому его стоит проверить. - person Jacques; 24.01.2018
comment
Что касается меня, я запускаю PHP7, и меня убили, хотя у меня 3 ГБ свободной оперативной памяти! и предел памяти PHP был установлен на -1, я пытаюсь решить @Fuser97381. - person Adam; 28.02.2018

Простой способ воспроизвести эту Killed ошибку:

Я смог воспроизвести эту ошибку на Ubuntu 12.10 с PHP 5.3.10.

Создайте PHP-скрипт с именем m.php и сохраните его:

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

Запустить его:

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

Программа загружает ЦП на 100% примерно на 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 остановилась и напечатала «Убито», потому что ей не хватило памяти из-за бесконечного цикла.

Решения:

  1. Увеличьте объем доступной оперативной памяти или объем памяти, доступный для этой программы PHP.
  2. Разбейте проблему на более мелкие части, которые работают последовательно.
  3. Перепишите программу так, чтобы она требовала меньше памяти или не использовала рекурсию так глубоко.
person Eric Leschinski    schedule 13.03.2014

В моем случае на CloudLinux, PHP 7.1, это происходило, когда 2 процесса читали и писали в один и тот же файл без блокировок.

person Boy    schedule 05.12.2018