2010-01-18 3 views
7

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

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

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

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

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

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

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

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

+0

Вы можете быть в состоянии порождать отдельный процесс, используя 'Exec()'. Попытка сохранить скрипт, работающий более 30 минут, путем прямого вызова браузера - это чистое безумие. –

+0

У вас есть доступ к журналам ошибок и доступа с сервера? Они, скорее всего, дадут вам больше информации о том, что происходит в этом случае. Также - можете ли вы воспроизвести проблему локально? Это может дать вам еще несколько возможностей для отладки. – objectified

+0

Нет, у меня нет доступа к журналам. Это одно, что меня действительно смущает. Я создал собственный файл csv журнала ошибок PHP, но никаких полезных ошибок PHP: -/ Я не тестировал его локально, так как требуется много времени, чтобы узнать. Я полагаю, что если он работает правильно, то это какая-то неясная настройка сервера, о которой я не знаю, или если она останавливается, то это какая-то неясная проблема с браузером, о которой я понятия не имею. В любом случае это не очень помогает. Я собираюсь попробовать совет Джеймса выше, хотя это кажется полезным. Любые другие идеи, хотя в то же время? – RobHardgood

ответ

0

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

+1

Ну, вы получаете то, за что платите. 1 & 1 дешево, потому что он сосет. –

3

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

+0

Вот что я думал! Разве нет способа предотвратить это браузер? И цвет меня noob, но мой пакет хостинга 1and1 - самый дешевый, который не поддерживает SSH ... и насколько я знаю, это единственный способ получить доступ к php через командную строку, не так ли? – RobHardgood

+0

Да, это в основном единственный способ. Могу ли я спросить, почему вы хотите бесконечно загружать? Большинство браузеров (помимо мобильных) должны быть в порядке, если вы постоянно отправляете их данные. –

+0

Ну, мой бесконечный цикл был просто для тестирования. Сценарий, который я пытаюсь исправить, должен запускаться в течение 30 или 40 минут, но он продолжает останавливаться после 20. Я пытался понять, почему с этим. Каждые несколько секунд он повторяет короткий текст. Разве это не те данные, которые браузеру необходимо держать в сеансе? – RobHardgood

3

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

php script.php 

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

<?php 

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

Я пробовал это сейчас ... Спасибо – RobHardgood

+0

Да, это не сработало – RobHardgood

+0

Попробуйте поднять максимальное время выполнения, используя ini_set ini_set ('max_execution_time', 300); // 5min – AndrewMurphy

1

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

Также вы попробовали ignore_user_abort?

0

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

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

2

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

В моем опыте отладки давно работает PHP скриптов, наиболее распространенной причиной была ошибка выделения памяти (Фатальная ошибка: Разрешены памяти размером XXXX байт исчерпаны ...)

Смежные вопросы