[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ограничить время выполнения
NitroGenerate
Всем доброго времени суток.
У меня есть цикл while, который порой в силу некоторых обстоятельств, не зависящих от меня и моего сервера, жутко тормозит, или вообще зависает на мертво.
Родилась гениальная идея, ограничить время на выполнение одного прохода цикла.
В мозгах моих полная пустота. Не знаю даже с чего начать.
Есть надумки, но наверное они бредовые.
Сделать счетчик.
но как тогда считать?
ведь в моем цикле
допустим
3 строчки
1.....
2.....
3.....
И зачастую 2 строка тормозит или зависает намертво. А одновременно сверять время и выполнять эту вторую строку наверное не удастся.

Вопрос банальный, как быть и что делать ?



Спустя 42 минуты, 45 секунд (13.01.2012 - 08:46) Игорь_Vasinsky написал(а):
$start = microtime(true); 
//20 секунд
$time_limit = 20*1000;
while()
{
...
...

if(microtime(true) == $start+$time_limit)
break;
}


а вообще в php есть свои рычаги для ограничения времени выполнения скриптов (но будет работать для всех одинаково)

Спустя 10 минут, 59 секунд (13.01.2012 - 08:57) Nikitian написал(а):
if(microtime(true) == $start+$time_limit)
Заменить на
if(microtime(true) >= $start+$time_limit)
А так всё верно

Спустя 1 минута, 9 секунд (13.01.2012 - 08:58) Игорь_Vasinsky написал(а):
ты думаешь может не поймать == ? ну вообще да >= это наверника, если вдруг глюк будет то при след иттерации сработает

Спустя 9 минут (13.01.2012 - 09:07) Nikitian написал(а):
Да, неизвестно сколько продлится итерация.
И 20 секунд будет так:
$time_limit = 20;
microtime() возвращает секунды, но более высокой точностью

Спустя 12 минут, 17 секунд (13.01.2012 - 09:19) Игорь_Vasinsky написал(а):
ааа... понял.

Спустя 4 минуты, 14 секунд (13.01.2012 - 09:23) NitroGenerate написал(а):
Все бы хорошо, но вот ситуация..

while()
{
...
...
/* зависло выполнение этой строчки*/
...
...

if(microtime(true) == $start+$time_limit)
break;
}

Зависло выполнение второй строчки. Скрипт разве дойдет до if(microtime(true)?
... что-то мне подсказывает, что он дойдет, когда строчка отвиснет, но мне то нужно если вторая строчка висит, и общее время выполнения прохода >= n-времени то перейти на следующий проход. В противном случае результата не будет.

Спустя 2 минуты, 37 секунд (13.01.2012 - 09:26) Игорь_Vasinsky написал(а):
while()
{
if(microtime(true) == $start+$time_limit)
break;
...
...
/* зависло выполнение этой строчки*/
...
...

}

Спустя 5 минут, 58 секунд (13.01.2012 - 09:32) redreem написал(а):
может просто пользовать set_time_limit?
http://www.php.su/functions/?set-time-limit

Спустя 1 минута, 24 секунды (13.01.2012 - 09:33) Игорь_Vasinsky написал(а):
он же для всего скрипта будет установлен. а так можно именно конкретный момент контролировать.

Спустя 7 минут, 57 секунд (13.01.2012 - 09:41) NitroGenerate написал(а):
Игорь, вы не поняли меня.
Скрипт состоит только из цикла.
Задача скрипта во что бы то ни было пройти 50 проходов через цикл.
Бывает что в проходах зависают некоторые строчки.
бывают на секунду, бывает на 10 секунд, а бывает на 20.
Так вот, если допустим, в пятом проходе скрипт завис на второй строчке и висит уже 15 секунд, а время ограниченное на выполнение одного прохода в цикле у меня 10 секунд.
Задача:
Прервать пятый проход цикла и перейти на следующий проход.
Ваш вариант полностью прервет цикл, мне этого не нужно.
Ваш вариант в начале проверяет суммарное время выполнения цикла. А мне нужно время прохода(время прохода напишу, проблем нет)
Ваш вариант проверяет в начале прохождения цикла условие. Мне нужно постоянно опрашивать.
И даже в тот момент когда выполняется и зависла функция именно для того, что бы сбросить этот проход, так как зависла функция и перейти на следующий!.

Спустя 9 минут, 59 секунд (13.01.2012 - 09:51) Игорь_Vasinsky написал(а):
Вот я вижу название темы

Цитата
Ограничить время выполнения 1-го прохода цикла


время- сказано.

если те нужно определённое кол-во иттераций то

$i = 0;
while()
{
$i++;
if($i == 50)
break;
....


}



а как пропустить шаг.. я не вкурсе, не было у меня такой цели никогда.

по сути он выполняется последовательно.

Спустя 7 минут, 39 секунд (13.01.2012 - 09:59) Winston написал(а):
Для перехода на следующую итерацию используй continue; вместо break;

Спустя 6 минут, 45 секунд (13.01.2012 - 10:06) Игорь_Vasinsky написал(а):
biggrin.gif точно.

Спустя 3 минуты, 10 секунд (13.01.2012 - 10:09) redreem написал(а):
вообще говоря перечитал еще раз топик темы - вывод у меня такой: вынести 2-ю строчку в отдельно адресуемый скрипт (не include, а именно совершенно отдельный url, чтобы сервер для него запускал свою сессию), для которого установить set_time_limit. ну и видимо этот скрипт только со 2-й строчкой должен отдавать в результате выполнения флаг успешности-провальности. брать данные с него по file_get_content например и усё.

Спустя 12 минут, 54 секунды (13.01.2012 - 10:22) NitroGenerate написал(а):
Там функция в кишках которой опросы сторонних сайтов, и эти сторонние сайты иногда оказываются сильно медленными.
Каждый проход цикла - 1 сайт для опроса.
И нужно при тормозном сайте просто прервать выполнение функции и текущего прохождения в цикле и перейти на проход следующей строки.

Спустя 46 минут, 20 секунд (13.01.2012 - 11:08) Nikitian написал(а):
В опросах поставьте таймаут нужный и всё. Долго отвечали - перешли к следующему.
Опросы же на curl сделаны?

Спустя 1 час, 51 минута, 5 секунд (13.01.2012 - 12:59) NitroGenerate написал(а):
file_get_contents()

Спустя 7 минут, 42 секунды (13.01.2012 - 13:07) Nikitian написал(а):
Опрашивайте стороние сайты через курл с таймаутом.

<?php
// создание нового ресурса cURL
$ch = curl_init();

// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);//Это и есть общий таймаут запроса

// загрузка страницы и выдача её браузеру

curl_exec($ch);

// завершение сеанса и освобождение ресурсов
curl_close($ch);
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.