PHP скрипт перестает работать произвольно без ошибок

у меня есть php-скрипт, который, казалось, перестал работать примерно через 20 минут.

я обнаружил, что то же самое происходит с этим простым бесконечным циклом. В какой-то момент между 15 и 25 минут бега, он останавливается без каких либо сообщений или ошибок. Браузер говорит "Готово".

Я за каждую вещь, которую я мог подумать:

set_time_limit ( session.gc_maxlifetime in the php.ini)
memory_limit
max_execution_time

точка, в которой сценарий остановлен, не согласована. Иногда он останавливается на 15 минутах, иногда на 22 минутах.

пожалуйста, любая помощь будет высоко оценили.

Он прошел на 1and1 сервер. Я связался с ними, и они не поддерживают ошибки, вызванные разработчиками.

6 ответов


в какой-то момент ваш браузер истекает и перестает загружать страницу. Если вы хотите проверить, откройте командную строку и выполните код. Сценарий должен выполняться бесконечно.


вы рассматривали только запуск сценария из командной строки, например:

php script.php

и пусть скрипт очищает сообщение так часто, что оно все еще работает:

<?php

while (true) {
  doWork();
  echo "still alive...";
  flush();
}

в таких случаях я включаю все настройки разработки в php.ini, конечно, на сервере разработки. Это отображение многих других сообщений, включая предупреждения об устаревании.

по моему опыту отладки длительных PHP-скриптов наиболее распространенной причиной был сбой выделения памяти (фатальная ошибка: разрешенный размер памяти xxxx байт исчерпан...)


Я думаю, что вам нужно узнать точное время, когда он останавливается (вы можете установить начальное время и продолжать сбрасывать текущее время минус начальное). На стороне сервера есть что-то, что останавливает файл. Кроме того, рассмотрите возможность выполнения ini_get для проверки, чтобы убедиться, что время выполнения фактически равно 0. Если вы хотите, установите ограничение по времени 30, а затем каждый цикл, который вы делаете, продолжайте устанавливать 30. Каждый раз, когда вы называете set_time_limit, счетчик сбрасывается и это может позволить вам обойти фактические пределы. Если это все еще не работает, на серверах 1and1 есть что-то, что может убить сценарий.

кроме того, вы пробовали ignore_user_abort?


Я ценю все комментарии. Особенно Джеймса Хартига, ты был очень полезен и направил меня на правильный путь. Я до сих пор не знаю в чем была проблема. Я получил его для запуска на сервере с использованием SSH, просто используя команду exec (), а также ignore_user_abort (). Но это все равно время. Итак, мне просто пришлось разбить его на маленькие кусочки, которые будут работать всего около 2 минут каждый, и использовать переменные/массивы сеанса для хранения там, где я остановился. Я рад, что покончил с этим честно. простой проект, и сбесилась на 1and1. Ну что ж...


Я думаю, что это вызвано тем, что какой-то монитор процессов убивает "зомби-процессы", чтобы разрешить ресурсы для других пользователей.

запустите exec, используя "2>&1", чтобы зарегистрировать все, включая stderr.

в моем выходе мне удалось поймать это:

...
script.sh: line 4: 15932 Killed                  php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php

Так что-то (внешняя сила, а не сам PHP) убивает мой процесс!

Я использую IdWebSpace что отлично BTW, но я думаю, что большинство общих хостинг-провайдеров навязать этот механизм управления ресурсами / процессами только для того, чтобы быть в здравом уме.