Я работаю над заданием 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», потому что у нее закончилась нехватка памяти из-за бесконечного цикла.
Решения:
Как не получить эту проблему снова
Если код, который вы написали, вызывает эту ошибку, и вы чувствуете, что застряли и не понимаете, зачем это происходит, вам нужно повторно посетить основное основное поведение структур, циклов и рекурсии PHP и как распределена память для удовлетворения эти конструкции: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/