Ответ 1
Возможно, вы запускаете убийцу Linux из памяти (OOM). Проверьте dmesg
на сообщения об этом. В нем говорится, какой процесс был убит, когда это произойдет.
Я работаю над заданием 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
, и мне интересно, что его убивает?
Возможно, вы запускаете убийцу Linux из памяти (OOM). Проверьте dmesg
на сообщения об этом. В нем говорится, какой процесс был убит, когда это произойдет.
Простой способ воспроизвести эту ошибку 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, циклов и рекурсии, а также то, как память выделенные для удовлетворения этих конструкций: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/
В моем случае в CloudLinux, PHP 7.1, это произошло, когда 2 процесса читали и записывали в один и тот же файл без блокировок.