Подтвердить что ты не робот

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

Я работаю над заданием CRON, которое вызывает PHP script, который много работает с циклами.

Он выполняется правильно, когда я ограничиваю набор данных, но когда я запускаю его против полного набора данных, ошибки script выводятся с сообщением:

Killed

set_time_limit is (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, и мне интересно, что его убивает?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

[email protected]:~/foo$ php m.php
Killed

Программа занимает 100% процессор в течение 15 секунд, затем останавливается с сообщением Killed. Посмотрите dmesg | grep php и есть подсказки:

[email protected]:~/foo$ dmesg | grep php
[2387779.707894] Out of memory: Kill process 2114 (php) score 868 or 
sacrifice child

Итак, в моем случае программа PHP остановилась и напечатала "Killed", потому что у нее закончилась нехватка памяти из-за бесконечного цикла.

Решения:

  • Увеличьте объем доступной памяти или объем памяти, доступный для этой программы PHP.
  • Разделите проблему на более мелкие куски, которые работают последовательно.
  • Перепишите программу, чтобы она имела меньшие требования к памяти или не настолько глубока с рекурсией.

Как не получить эту проблему снова

Если код, который вы написали, вызывает эту ошибку, и вы чувствуете, что застряли и не понимаете, зачем он это делает, вам нужно повторно посетить основное основное поведение структур PHP, циклов и рекурсии, а также то, как память выделенные для удовлетворения этих конструкций: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

Ответ 3

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