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

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

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

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 ошибках, и мне интересно, что заставляет его убивать?

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

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

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

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