Что останавливает PHP?
В продолжение темы PHP зависает консольный скрипт, помогите найти причину!
Отбросил все суждения о работе своего скрипта, и пошел иным методом.
Создал простейший скрипт
<?php
if ( isset ( $_GET['run'] ) )
{
exec ( '/usr/bin/php /var/www/sr/data/www/1.php > /dev/null 2>/dev/null &');
echo 'Runed!';
exit;
}
# Просто скрипт который крашится
for ( $i = 1; $i < 10000; $i++ )
{
sleep ( 1 );
file_put_contents ( '/var/www/sr/data/www/1.txt', $i );
}
?>
Запускаю его, открыв в браузере mysite/script.php?run, запуск успешный. Далее мониторю изменения в файле 1.txt. В моем случае один раз "посчитал" до 421, второй раз до 1054, больше не проверял - уже понятно, что ЧТО-ТО останавливает работу скрипта.
Сервер выделенный, версия PHP7.2, пробовал 8.1 - то же самое.
Помогите найти причину!
Ответы (2 шт):
поставьте
set_time_limit(0);
у php скриптов выставляется настройка продолжительности времени работы скрипта (причем для выполнении из консоли есть отдельная настройка). Если скрипт не успевает отработать за выставленное количество секунд - он отрубается.
На будущее - если вы не знаете какая ошибка привела к завершению скрипта - загляните в логи php или используйте try{}catch с записью файла, и таких вопросов у вас уже не будет
Наше обсуждение перенесено в чат, но я всё же напишу здесь. Вчера я говорил, что запустил скрипт на своем сервере, но из-за sleep он выполнялся не мгновенно. Сегодня же я зашел на сервер и скрипт отработал корректно и до конца.
Пожалуй вынесу наиболее вероятные причины.
- Авто-рестарт PHP-FPM, возможно у вас где то спрятан скрипт авторестарта, посмотрите, просмотрите скрипты автозагрузки. Авторестарты часто любят делать во избежание некоторых проблем, но они сулят десятки других проблем.
- Таймаут, что маловероятно, так как у вас скрипт доходил до разных значений.
- Возможно есть другой PHP код, который ломает PHP и он из-за этого "падает", из-за чего у вас прекращается работа PHP скрипта с циклом.
- Лимит ОЗУ для PHP.
Опять же, если не докопаетесь до истины, переустановите ОС на сервере предварительно сделав бекап, так как на моем сервере всё отработало как и положено. (но у меня отключен таймаут и лимит ОЗУ под PHP - 16 ГБ).

