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

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

Чтобы попытаться понять, почему, я сделал очень простой скрипт, чтобы увидеть, как долго он будет работать без какого-либо сложного кода, чтобы запутать меня.

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

Я был над каждой возможной возможностью, о которой я мог подумать:

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

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

Пожалуйста, любая помощь будет принята с благодарностью.

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

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

Вы считали, что просто запускаете скрипт из командной строки, например:

 php script.php 

и каждый раз скрипт выдает сообщение так часто, что его все еще работает:

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

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

По моему опыту отладки длинных сценариев php, наиболее распространенной причиной был отказ в распределении памяти (Fatal error: Допустимый размер памяти xxxx-байтов исчерпан …)

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

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

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

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

Запустите 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, но я думаю, что большинство хостинг-провайдеров навязывают этот механизм управления ресурсами / процессами просто для того, чтобы быть нормальным.