| |
|
|
| | Иногда случается, что при отладке рождается бесконечный цикл, который надо принудительно завершить. Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp. Если же зацикливание происходит на Денвере, то дело хуже, ибо в этом случае практически невозможно вызвать Диспетчер задач, а если он в конце концов и вызывется, то снимет задачу минут через пять, так что быстрее горячей кнопкой перезагрузить компьютер...
А нет ли способа корректного и быстрого прерывания бесконечного цикла? | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | поставьте таймер на основе microtime()
если он станет циклить дольше пяти секунд то остановите break | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | break | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | Странно: а почему это у вас "практически невозможно вызвать Диспетчер задач" ? Жмете Ctrl+Alt+Del да и все... Можно еще остановить Денвер (StopServers) если зацикливание происходит в серверном скрипте. | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | set_time_limit ? | |
| |
|
|
| |
|
|
| |
для: kasmanaft
(03.06.2007 в 12:13)
| | | "Странно: а почему это у вас "практически невозможно вызвать Диспетчер задач" ? Жмете Ctrl+Alt+Del да и все... " - Вероятно, по той причине, что цикл забивает процессор, и он даже не может прочесть следующую команду. Может быть, ставит её в очередь, и Диспетчер появляется далеко не сразу, причем "проявляется" медленно, как в замедленном кино... А уж остановки процесса и вообще не дождешься!
"Можно еще остановить Денвер (StopServers) если зацикливание происходит в серверном скрипте."
А вот это не так! Остановка Денвера останавливает только Апач и базу, а инструкции рнр продолжают исполняться.
А вот о лимите времени исполнения я и не подумал! Маленькая таймерная утилитка пригодится на все случаи отладки циклов!
Спасибо за идею! | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | Во время отладки ставьте дополнительное условие выхода из цикла, скажем после 100 000 итераций. | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | >Иногда случается, что при отладке рождается бесконечный цикл, который надо принудительно завершить. Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp.
Был у меня пару месяцев назад такой случай. Тестировал ICQ бота. Нашёл замечательный хостинг. И всё замечательно работало. Отключение бота (завершение цикла while) было предусмотрено только при получении определённой команды с моего уина. Всё было прекрасно, пока я не накосячил, при обновлении бота, в этом самом цикле. Бот в online не выходил, при этом начал довольно быстро расти "error_log" в дирректории бота.
1. Переименовал файл бота - никаких изменений.
2. Удалил файл бота - никаких изменений.
3. Снёс директорию с ботом - никаких изменений.
Ничего не помогало, а "error_log" рос не по дням, а по секундам. В общем "работало" всё это безобразие, пока я на следующий день не обратился в поддержку, где мне помогли удалением процесса.
P.S. с тех пор скрипты на этом хостинге выполняются не дольше 7 минут.
Теперь при отладке скриптов на хостингах ненадёжные циклы делаю по такому шаблону:
<?php
set_time_limit(0);
ignore_user_abort(true);
while(true){
/*
* Кое-что, что работает, но не всегда корректно.
*/
if(!file_exists('flag.txt'))break;
}
?>
|
| |
| |
|
|
| |
|
|
| |
для: sms-send
(04.06.2007 в 10:23)
| | | кстати хороший способ)) | |
| |
|
|
| |
|
|
| |
для: bronenos
(04.06.2007 в 11:11)
| | | способ хороший.... Но иногда зацикливание может происходить и внутри стандартных функций. Так что set_time_limit на 30 секунд (вроде бы умалчиваемое значение) никогда не повредит. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.06.2007 в 11:57)
| | | >способ хороший.... Но иногда зацикливание может происходить и внутри стандартных функций. Так что set_time_limit на 30 секунд (вроде бы умалчиваемое значение) никогда не повредит.
В боте это не приемлимо, он должен выполняться месяцами непрерывно. Подобные ограничения ставлю только при отладке. | |
| |
|
|
| |
|
|
| |
для: sms-send
(04.06.2007 в 13:46)
| | | бот на php не пишут. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.06.2007 в 14:25)
| | | >бот на php не пишут.
Это ещё почему? | |
| |
|
|
| |
|
|
| |
для: sms-send
(04.06.2007 в 14:39)
| | | в массовом порядке - я имею в виду. | |
| |
|
|
| |
|
|
| |
для: Владимир55
(03.06.2007 в 12:02)
| | | Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp
И абсолютно ничего исполняющемуся в RAM скрипту не станет. | |
| |
|
|
| |
|
|
| |
для: Unkind
(04.06.2007 в 11:21)
| | | >Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp
>И абсолютно ничего исполняющемуся в RAM скрипту не станет.
лимит памяти закончиться и скрипт сам астановиться :-p | |
| |
|
|
| |
|
|
| |
для: Sobachka
(04.06.2007 в 22:34)
| | | Нет, конечно, не закончится и не остановится. | |
| |
|
|