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