Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как прервать бесконечный цикл?
 
 автор: Владимир55   (03.06.2007 в 12:02)   письмо автору
 
 

Иногда случается, что при отладке рождается бесконечный цикл, который надо принудительно завершить. Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp. Если же зацикливание происходит на Денвере, то дело хуже, ибо в этом случае практически невозможно вызвать Диспетчер задач, а если он в конце концов и вызывется, то снимет задачу минут через пять, так что быстрее горячей кнопкой перезагрузить компьютер...

А нет ли способа корректного и быстрого прерывания бесконечного цикла?

   
 
 автор: bronenos   (03.06.2007 в 12:05)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

поставьте таймер на основе microtime()
если он станет циклить дольше пяти секунд то остановите break

   
 
 автор: CrazyAngel   (03.06.2007 в 12:09)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

break

   
 
 автор: coloboc66   (03.06.2007 в 12:09)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

Странно: а почему это у вас "практически невозможно вызвать Диспетчер задач" ? Жмете Ctrl+Alt+Del да и все... Можно еще остановить Денвер (StopServers) если зацикливание происходит в серверном скрипте.

   
 
 автор: kasmanaft   (03.06.2007 в 12:13)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

set_time_limit ?

   
 
 автор: Владимир55   (03.06.2007 в 12:59)   письмо автору
 
   для: kasmanaft   (03.06.2007 в 12:13)
 

"Странно: а почему это у вас "практически невозможно вызвать Диспетчер задач" ? Жмете Ctrl+Alt+Del да и все... " - Вероятно, по той причине, что цикл забивает процессор, и он даже не может прочесть следующую команду. Может быть, ставит её в очередь, и Диспетчер появляется далеко не сразу, причем "проявляется" медленно, как в замедленном кино... А уж остановки процесса и вообще не дождешься!

"Можно еще остановить Денвер (StopServers) если зацикливание происходит в серверном скрипте."
А вот это не так! Остановка Денвера останавливает только Апач и базу, а инструкции рнр продолжают исполняться.

А вот о лимите времени исполнения я и не подумал! Маленькая таймерная утилитка пригодится на все случаи отладки циклов!

Спасибо за идею!

   
 
 автор: cheops   (04.06.2007 в 10:03)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

Во время отладки ставьте дополнительное условие выхода из цикла, скажем после 100 000 итераций.

   
 
 автор: sms-send   (04.06.2007 в 10:23)   письмо автору
 
   для: Владимир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;
}

?>

   
 
 автор: bronenos   (04.06.2007 в 11:11)   письмо автору
 
   для: sms-send   (04.06.2007 в 10:23)
 

кстати хороший способ))

   
 
 автор: Trianon   (04.06.2007 в 11:57)   письмо автору
 
   для: bronenos   (04.06.2007 в 11:11)
 

способ хороший.... Но иногда зацикливание может происходить и внутри стандартных функций. Так что set_time_limit на 30 секунд (вроде бы умалчиваемое значение) никогда не повредит.

   
 
 автор: sms-send   (04.06.2007 в 13:46)   письмо автору
 
   для: Trianon   (04.06.2007 в 11:57)
 

>способ хороший.... Но иногда зацикливание может происходить и внутри стандартных функций. Так что set_time_limit на 30 секунд (вроде бы умалчиваемое значение) никогда не повредит.

В боте это не приемлимо, он должен выполняться месяцами непрерывно. Подобные ограничения ставлю только при отладке.

   
 
 автор: Trianon   (04.06.2007 в 14:25)   письмо автору
 
   для: sms-send   (04.06.2007 в 13:46)
 

бот на php не пишут.

   
 
 автор: sms-send   (04.06.2007 в 14:39)   письмо автору
 
   для: Trianon   (04.06.2007 в 14:25)
 

>бот на php не пишут.

Это ещё почему?

   
 
 автор: Trianon   (04.06.2007 в 15:44)   письмо автору
 
   для: sms-send   (04.06.2007 в 14:39)
 

в массовом порядке - я имею в виду.

   
 
 автор: Unkind   (04.06.2007 в 11:21)   письмо автору
 
   для: Владимир55   (03.06.2007 в 12:02)
 

Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp
И абсолютно ничего исполняющемуся в RAM скрипту не станет.

   
 
 автор: Sobachka   (04.06.2007 в 22:34)   письмо автору
 
   для: Unkind   (04.06.2007 в 11:21)
 

>Если такое происходит на сервере, то я просто удаляю исполняющийся файл по ftp
>И абсолютно ничего исполняющемуся в RAM скрипту не станет.
лимит памяти закончиться и скрипт сам астановиться :-p

   
 
 автор: Unkind   (04.06.2007 в 23:36)   письмо автору
 
   для: Sobachka   (04.06.2007 в 22:34)
 

Нет, конечно, не закончится и не остановится.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования