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

Форум PHP

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

 

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

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

тема: Как задать время выполнения скрипта
 
 автор: Andrey_V   (04.03.2006 в 15:03)   письмо автору
 
 

Подскажите, пожалуйста.
Имеем скрипт, который запрашивает информацию с другого сайта (считывает из имеющегося там файла).
Все работает нормально. Но хочется застраховаться на будущее.
Если на том сайте исчезнет файл, или его объем будет таким, что не успеет считаться за отведенное для выполнения время, то мой сайт выведет ошибку и не будет выполнять дальше открытие нужной страницы.
Можно ли сделать так, чтобы для выполнения скрипта задавалось определенное время, например, 5 секунд, и если данные не получены по любой причине, скрипт продолжал выполняться дальше?

   
 
 автор: Саня   (04.03.2006 в 15:08)   письмо автору
 
   для: Andrey_V   (04.03.2006 в 15:03)
 

.

   
 
 автор: Саня   (04.03.2006 в 15:08)   письмо автору
 
   для: Andrey_V   (04.03.2006 в 15:03)
 

set_time_limit() - устанавливает максимальное время выполнения скрипта в секундах (set_time_limit(5)).

   
 
 автор: Artem S.   (04.03.2006 в 15:08)   письмо автору
 
   для: Andrey_V   (04.03.2006 в 15:03)
 

Смутный вопрос - получайте смутный ответ:
Если говорит о соединении с другим хостом, нужно определиться каким методом идет соединение. Для curl есть свои методы, для fsockopen свои.
Можно ограничить и через set_time_limit и задать функцию завершения через register_shutdown_function, смотря какая логика работы.
Так что однозначного ответа дать нельзя на то, что вы написали.

   
 
 автор: Andrey_V   (04.03.2006 в 15:45)   письмо автору
 
   для: Artem S.   (04.03.2006 в 15:08)
 

Попробую написать конкретнее, если получится:
У меня каталог. В нем цены в валюте. При выводе каталога запрашивается сайт центробанка, получаются курсы валют. С их помощью цены пересчитываются в рубли.
Что будет, если по какой-то причине не удастся получить информацию с сайта ЦБ? Появляется сообщение о том, что время исполнения истекло. На экране только сообщение об ошибке и все. А надо, чтобы в этом случае скрипт брал из базы данных информацию о курсах за вчерашний день.
Сами курсы получаются достаточно быстро, если нет каких-то проблем на сайте ЦБ или в канале связи. И хотелось бы, чтобы время запроса было ограничено, например 5 сек. Если за это время информация не получена - считаем что произошел сбой.
В обычных программах пишу обработчик ошибки, типа: если ошибка, то продолжаем исполнение скрипта с значением переменных, например, $USD = 28,8, $EURO = 34.2 (из базы данных).
Если опять не так изложил - напишите, попробую еще как-то изложить.

   
 
 автор: Artem S.   (04.03.2006 в 16:39)   письмо автору
 
   для: Andrey_V   (04.03.2006 в 15:45)
 

Как получается информация с сайта ЦБ, каким образом?

   
 
 автор: Andrey_V   (04.03.2006 в 16:57)   письмо автору
 
   для: Artem S.   (04.03.2006 в 16:39)
 

Скрипт брал, кажется, на этом же сайте где-то. Формируется запрос с указанием файла, содержащего информацию на сайте ЦБ (типа: дата, на которую нужен курс25022006.text). Запрос идет туда, информацию о курсах оттуда к нам. Но были случаи, когда получаю ответ, что такого файла нет. Хотя на самом деле он есть. Т.е. где-то какой-то сбой. Но в этом случае у меня вместо страницы отражается сообщение об ошибке. Через несколько минут повторяю запрос, информация приходит нормально. Так надо сделать, чтобы при сбое все равно выходила нормальная страницы

   
 
 автор: Artem S.   (04.03.2006 в 18:54)   письмо автору
 
   для: Andrey_V   (04.03.2006 в 16:57)
 

если не трудно прилажите сюда часть кода.

   
 
 автор: Andrey_V   (05.03.2006 в 13:15)   письмо автору
 
   для: Artem S.   (04.03.2006 в 18:54)
 

Вот подработал. Т.е. даю тот кусок кода, который вызывает интерес.
=================================
<?php
set_time_limit(2);
$link="http://www.cbr.ru/scripts/XML_daily.asp?date_req=06.03.2006";
$fd = fopen($link, "r");
echo "<br>"."555555555555555";
?>
=================================
Результаты его работы следующие.
1. Если все срабатывает нормально, то исполняется он мгновенно.
2. Если нет доступа к файлу (имитирую на локальном сервере с отключенным доступом в Интернет), то скрипт выполняется секунд 15, потом выдает ошибку, что не может получить данные. И не реагирует на установку времени выполнения.
3. А хочется, чтобы при отсутствии связи (т.е. реально при отсутствии возможности получения информации) выполнение скрипта прекращалось через несколько секунд (например, 3 или 5). А то очень долго ждать открытия страницы.

   
 
 автор: Саня   (05.03.2006 в 15:00)   письмо автору
 
   для: Andrey_V   (05.03.2006 в 13:15)
 

Думаю, тут можно только сокетами. А потом - избавиться от заголовков в начале ответа и получим запрашиваемый XML-файл.

   
 
 автор: Artem S.   (05.03.2006 в 15:40)   письмо автору
 
   для: Andrey_V   (05.03.2006 в 13:15)
 

еще попробуйте функцию
stream_set_timeout
http://ru2.php.net/stream_set_timeout

//$errno == "10060"
Это только для windows

   
 
 автор: Andrey_V   (05.03.2006 в 15:47)   письмо автору
 
   для: Artem S.   (05.03.2006 в 15:40)
 

А как здесь можно применить функцию stream_set_timeout?
Что-то я ее и так и сяк крутил - все никак не получается.

   
 
 автор: Artem S.   (05.03.2006 в 17:33)   письмо автору
 
   для: Andrey_V   (05.03.2006 в 15:47)
 

<?php

$link="http://www.cbr.ru/scripts/XML_daily.asp?date_req=06.03.2006";
$fd = fopen($link, "r");
if (!$fd) {
echo "Unable to open\n";
} else {
stream_set_blocking($fp, 0);
stream_set_timeout($fp, 2);

$res = fread($fp, 2000);

$info = stream_get_meta_data($fp);
fclose($fd);
if ($info['timed_out']) {
echo 'Connection timed out!';
} else {
echo $res;
}
}
echo "<br>"."555555555555555";
?>

   
 
 автор: Andrey_V   (11.03.2006 в 00:45)   письмо автору
 
   для: Artem S.   (05.03.2006 в 17:33)
 

Спасибо. Буду пробовать

   
Rambler's Top100
вверх

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