Общая ошибка "Killed" в PHP-скрипте - PullRequest
48 голосов
/ 05 июня 2009

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

Ответы [ 3 ]

67 голосов
/ 05 июня 2009

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

16 голосов
/ 13 марта 2014

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

Решения:

  1. Увеличение объема доступной оперативной памяти или объема памяти, доступной для этой программы PHP.
  2. Разбейте проблему на более мелкие фрагменты, которые работают последовательно.
  3. Перепишите программу, чтобы она имела меньшие требования к памяти или не слишком углублялась в рекурсию.
0 голосов
/ 06 декабря 2018

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

...