Бывало ли у вас, что скрипт на php подвисает на несколько минут просто так?
Здравствуйте.
PHP 7.2.15 (cli)
Имеется php скрипт, который работает в бесконечном цикле. Выполняется ряд действий, которые логируются, пауза минута и опять по новой. И иногда между двумя записями в логах может пройти не положенные 1-2 секунды, а несколько минут, а то и 10 минут.
Скрипт запускается на купленном VPS.
Для исключения причин в самом впс, параллельно запущен скрипт, который пишет в лог каждую секунду запись, в нём таких пробелов нету.
Мониторил процессы/ресурсы через atop, ничего подозрительного не показало.
Подскажите, на что может быть похоже? Искать причину в самом коде не где, т.к. такие пробелы каждый раз появляются в новом месте.
Пока логов не будет - это все гадание на кофейной гуще. Обложите путь выполнения скрипта трэйсами, посмотрите в чем дело - быть может поймали лок в бд или внешний сервис долго отвечает на запрос. Плюс выглядит так, что while(true) можно поменять на запуск по крону - говорят php рожден, чтобы умирать
Ну так пока ряд действий не выполнится, не переходит к следующим. Видимо при определенных условиях (входных данных) ряд действий выполняется долго.
пауза минута
как она реализована? В скрипте? Тогда она срабатывает только когда выполнится скрипт (интеграция в Вашем цикле). Вы не параллельно логирование запускайте а внутри цикла, перед паузой. Логируйте ошибки и т.д.
а что скрипт обязан всегда выполняться одинаковое количество времени? Даже 1+2 будет с разной скоростью каждый раз выполняться, а у Вас там явно что-то сложнее. Засекайте время и пишите в логи входные данные, которые вызывают превышение Ваших ожиданий.
Если хотите запускать каждую минуту - надо как сказал hOtRush крон юзать.
hOtRush, Максим Тимофеев, крон конечно правильнее использовать, но как быть в ситуации если параллельное выполнение двух копий скрипта недопустимо и является критичным условием?
vebmaster, ну так сейчас нету потому что у вас бесконечный цикл и один процесс, а на кроне вполне может появиться параллельное выполнение, если проблема не связана с циклами, а задержка действительно где-то внутри скрипта
как быть в ситуации если параллельное выполнение двух копий скрипта недопустимо и является критичным условием?
Запускать скрипт, а в нем делать проверку, хранить где-то флаг (boolean), который отменит запуск, если не закончился предыдущий.
ну или средствами самого крона: Как сделать условия для cron задачи?
Stalker_RED, проблема возникает очень редко, например 1 раз в день, а то 1 раз в несколько дней. Причём в разных местах.
Например, между завершением работы метода и запуском следующего метода (примерно так). По сути сложных действий нету.
vebmaster, Допустим запустился backup в фоне и то что у Вас ранее занимало 1с стало занимать 100с. Или любая другая нагрузка пришла откуда не ждали. Если бы у Вас это был единственный скрипт - тогда странно. А так - надо искать. Вариантов миллион.
peterpro, линуксовый flock пробовал, он создаёт очередь и как только освобождается ЛОК-файл, то тут же продолжает работу. Мне нужно было мгновенный выход из скрипта.