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