PDA

Просмотр полной версии : почему останавливается скрипт?


Дикс
03.10.2009, 09:59
замечал такое на некоторых хостингах
работает пхп-скрипт минуты 3-5 и вдруг ни с того ни с сего останавливается. ни ошибок, ни ограничений на время выполнения.
причем иногда это бывает вообще в самое разное время после запуска.
с чем это может быть связано? браузер может оборвать соединение?

lo0
03.10.2009, 10:21
Есть такая функция ignore_user_abort (http://ru2.php.net/manual/en/function.ignore-user-abort.php)
+
пару слов о скрипте, хотябы знать, с чем он работает, т.к. без дополнительной инфы очень тяжело помочь.

Zedi
03.10.2009, 10:44
скорее всего останавливается ииза того что память у него кончается, попробуй количество памяти разрешенной увеличть(на некоторых хостингах выделяют больше на других меньше, поэтому он работает так)
но если это не поможет попробуй в скрипте вести типа лога чтобы увидеть когда он остановился там можно разобраться почему
P.S.ignore_user_abort по моему здесь не при чем, скрипт бы завершался сразу после закрытия браузера но не через 2-3 минуты

b1oxa
03.10.2009, 12:28
скорее всего останавливается ииза того что память у него кончается, попробуй количество памяти разрешенной увеличть(на некоторых хостингах выделяют больше на других меньше, поэтому он работает так)
но если это не поможет попробуй в скрипте вести типа лога чтобы увидеть когда он остановился там можно разобраться почему
P.S.ignore_user_abort по моему здесь не при чем, скрипт бы завершался сразу после закрытия браузера но не через 2-3 минуты

согласен.
попробуй этот же скрипт на других хостах.

Tigger
03.10.2009, 13:01
1) set_time_limit(0);
2) В php.ini стоят значения на выполнения, которые нельзя изменить;
3) Вариант Zedi.

Deathdreams
03.10.2009, 14:15
ini_set('memory_limit', 15);

Думаю, 15 МБ хватит.

Doom123
03.10.2009, 15:10
Deathdreams а помойму надо так ini_set('memory_limit', '15M'); не?

Pashkela
03.10.2009, 15:18
To change the memory allocation limit permanently for all PHP scripts running on the server, modify the PHP.INI configuration file of the server (location depending on your OS and installation method). Search for memory_limit after opening the file in an editor. If the memory_limit doesn’t exist, add the following line. If it’s there, modify the value of the memory_limit:

memory_limit = 12M

The 12M sets the limit to 12 megabytes (12582912 bytes). Change to the value you desirable.


Перевод:


Чтобы изменить предел распределения памяти надолго для всех подлинников PHP, бегущих на сервере, измените файл конфигурации PHP.INI сервера (местоположение в зависимости от Вашего OS и инсталляционного метода). Поиск memory_limit после открытия файла в редакторе. Если memory_limit не существует, добавьте следующую линию. Если это там, измените ценность memory_limit:

memory_limit = 12M

12M устанавливает предел к 12 мегабайтам (12582912 байтов). Измените на ценность Вас желательный.

Deathdreams
03.10.2009, 18:55
Doom123
Да так. Забыл просто в каком формате.

BlackSun
03.10.2009, 18:58
скорее всего останавливается ииза того что память у него кончается, попробуй количество памяти разрешенной увеличть(на некоторых хостингах выделяют больше на других меньше, поэтому он работает так)
но если это не поможет попробуй в скрипте вести типа лога чтобы увидеть когда он остановился там можно разобраться почему
P.S.ignore_user_abort по моему здесь не при чем, скрипт бы завершался сразу после закрытия браузера но не через 2-3 минуты
ignore_user_abort как раз и нужен, у меня тоже скрипты останавливаются даже с нулевым тайм лимитом и при этом памяти им хватает.

2ТС: как и говорили - юзай set_time_limit + ignore_user_abort, весь вывод записывай во временный файл, а просматривай другим скриптом, так надежнее. Собственно подобный метод применяется в нормальных FTP чекерах на пыхе.

Zedi
03.10.2009, 19:53
ну если браузер не закрывать то ignore_user_abort не нужен)) скрипт должен остановится сразу после закрытия браузера
P.S. у меня скрипты останавливались сами и с set_time_limit + ignore_user_abort и памяти хватало, многое зависит от хоста

BlackSun
03.10.2009, 20:02
ну если браузер не закрывать то ignore_user_abort не нужен)) скрипт должен остановится сразу после закрытия браузера
P.S. у меня скрипты останавливались сами и с set_time_limit + ignore_user_abort и памяти хватало, многое зависит от хоста
Если скрипт ничего клиенту не отдает, то, имхо, сосединение может оборватся по keep-alive таймауту

Zedi
03.10.2009, 20:11
ну из этого нужно сделать вывод что нужно set_time_limit + ignore_user_abort + увеличение памяти)))
если не получится то как я уже сказал вести лог программы, можно даже в окно брацзера только после каждого echo ставь flush()

astrologer
03.10.2009, 20:15
Если скрипт ничего клиенту не отдает, то, имхо, сосединение может оборватся по keep-alive таймауту Если скрипт ничего не отдаёт, то и про обрыв соединения он не узнает.

Дикс
04.10.2009, 08:21
Есть такая функция ignore_user_abort
если её включить - скрипт вообще нельзя будет остановить

попробуй в скрипте вести типа лога чтобы увидеть когда он остановился
вся его работа логируется на экран.
потому и пишу что он в разные моменты останавливается.
а на денвере 100% работает.

2ТС: как и говорили - юзай set_time_limit + ignore_user_abort, весь вывод записывай во временный файл, а просматривай другим скриптом, так надежнее. Собственно подобный метод применяется в нормальных FTP чекерах на пыхе.
я сам пишу "нормальные чекеры"
далеко не всегда допустимо включать ignore_user_abort

Если скрипт ничего клиенту не отдает, то, имхо, сосединение может оборватся по keep-alive таймауту
он выводит лог на экран
а если не выводит - то включен как раз ignore_user_abort

в окно брацзера только после каждого echo ставь flush()


@ob_end_flush();
@ob_flush();
@flush();
@ob_start();

В общем пришёл к выводу что надо попробовать увеличить память

mailbrush
04.10.2009, 09:55
ТС, не используй PHP для брутеров, ботов и т.п... Лучше используй Perl (это на счет некомпилируемых) или C++ (компилируемый). У меня была та же проблема, и я решил забить на написание тому подобных скриптов на PHP.

Zedi
04.10.2009, 10:32
если её включить - скрипт вообще нельзя будет остановить
используй проверку чтот типа есть файл с названием stop то die(); тогда скрипт можно остановить))

Pashkela
04.10.2009, 13:33
Скрипт можно остановить также просто перезаписав на его место новый скрипт с тем же именем и запустить:


<?exit;?>

Дикс
04.10.2009, 17:43
ТС, не используй PHP для брутеров, ботов и т.п... Лучше используй Perl (это на счет некомпилируемых) или C++ (компилируемый).
для этого надо их как минимум знать :)