Что останавливает PHP?

Рейтинг: 0Ответов: 2Опубликовано: 02.02.2023

В продолжение темы 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 - то же самое.

Помогите найти причину!


Дополнено: вывод Htop. введите сюда описание изображения

Вывод dmesg введите сюда описание изображения

Ответы

▲ 1

поставьте

set_time_limit(0);

у php скриптов выставляется настройка продолжительности времени работы скрипта (причем для выполнении из консоли есть отдельная настройка). Если скрипт не успевает отработать за выставленное количество секунд - он отрубается.

На будущее - если вы не знаете какая ошибка привела к завершению скрипта - загляните в логи php или используйте try{}catch с записью файла, и таких вопросов у вас уже не будет

▲ 0

Наше обсуждение перенесено в чат, но я всё же напишу здесь. Вчера я говорил, что запустил скрипт на своем сервере, но из-за sleep он выполнялся не мгновенно. Сегодня же я зашел на сервер и скрипт отработал корректно и до конца.

Пожалуй вынесу наиболее вероятные причины.

  1. Авто-рестарт PHP-FPM, возможно у вас где то спрятан скрипт авторестарта, посмотрите, просмотрите скрипты автозагрузки. Авторестарты часто любят делать во избежание некоторых проблем, но они сулят десятки других проблем.
  2. Таймаут, что маловероятно, так как у вас скрипт доходил до разных значений.
  3. Возможно есть другой PHP код, который ломает PHP и он из-за этого "падает", из-за чего у вас прекращается работа PHP скрипта с циклом.
  4. Лимит ОЗУ для PHP.

Опять же, если не докопаетесь до истины, переустановите ОС на сервере предварительно сделав бекап, так как на моем сервере всё отработало как и положено. (но у меня отключен таймаут и лимит ОЗУ под PHP - 16 ГБ).