|
|
|
| Подскажите, пожалуйста.
Имеем скрипт, который запрашивает информацию с другого сайта (считывает из имеющегося там файла).
Все работает нормально. Но хочется застраховаться на будущее.
Если на том сайте исчезнет файл, или его объем будет таким, что не успеет считаться за отведенное для выполнения время, то мой сайт выведет ошибку и не будет выполнять дальше открытие нужной страницы.
Можно ли сделать так, чтобы для выполнения скрипта задавалось определенное время, например, 5 секунд, и если данные не получены по любой причине, скрипт продолжал выполняться дальше? | |
|
|
|
|
|
|
|
для: Andrey_V
(04.03.2006 в 15:03)
| | . | |
|
|
|
|
|
|
|
для: Andrey_V
(04.03.2006 в 15:03)
| | set_time_limit() - устанавливает максимальное время выполнения скрипта в секундах (set_time_limit(5)). | |
|
|
|
|
|
|
|
для: Andrey_V
(04.03.2006 в 15:03)
| | Смутный вопрос - получайте смутный ответ:
Если говорит о соединении с другим хостом, нужно определиться каким методом идет соединение. Для curl есть свои методы, для fsockopen свои.
Можно ограничить и через set_time_limit и задать функцию завершения через register_shutdown_function, смотря какая логика работы.
Так что однозначного ответа дать нельзя на то, что вы написали. | |
|
|
|
|
|
|
|
для: Artem S.
(04.03.2006 в 15:08)
| | Попробую написать конкретнее, если получится:
У меня каталог. В нем цены в валюте. При выводе каталога запрашивается сайт центробанка, получаются курсы валют. С их помощью цены пересчитываются в рубли.
Что будет, если по какой-то причине не удастся получить информацию с сайта ЦБ? Появляется сообщение о том, что время исполнения истекло. На экране только сообщение об ошибке и все. А надо, чтобы в этом случае скрипт брал из базы данных информацию о курсах за вчерашний день.
Сами курсы получаются достаточно быстро, если нет каких-то проблем на сайте ЦБ или в канале связи. И хотелось бы, чтобы время запроса было ограничено, например 5 сек. Если за это время информация не получена - считаем что произошел сбой.
В обычных программах пишу обработчик ошибки, типа: если ошибка, то продолжаем исполнение скрипта с значением переменных, например, $USD = 28,8, $EURO = 34.2 (из базы данных).
Если опять не так изложил - напишите, попробую еще как-то изложить. | |
|
|
|
|
|
|
|
для: Andrey_V
(04.03.2006 в 15:45)
| | Как получается информация с сайта ЦБ, каким образом? | |
|
|
|
|
|
|
|
для: Artem S.
(04.03.2006 в 16:39)
| | Скрипт брал, кажется, на этом же сайте где-то. Формируется запрос с указанием файла, содержащего информацию на сайте ЦБ (типа: дата, на которую нужен курс25022006.text). Запрос идет туда, информацию о курсах оттуда к нам. Но были случаи, когда получаю ответ, что такого файла нет. Хотя на самом деле он есть. Т.е. где-то какой-то сбой. Но в этом случае у меня вместо страницы отражается сообщение об ошибке. Через несколько минут повторяю запрос, информация приходит нормально. Так надо сделать, чтобы при сбое все равно выходила нормальная страницы | |
|
|
|
|
|
|
|
для: Andrey_V
(04.03.2006 в 16:57)
| | если не трудно прилажите сюда часть кода. | |
|
|
|
|
|
|
|
для: 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). А то очень долго ждать открытия страницы. | |
|
|
|
|
|
|
|
для: Andrey_V
(05.03.2006 в 13:15)
| | Думаю, тут можно только сокетами. А потом - избавиться от заголовков в начале ответа и получим запрашиваемый XML-файл. | |
|
|
|
|
|
|
|
для: Andrey_V
(05.03.2006 в 13:15)
| | еще попробуйте функцию
stream_set_timeout
http://ru2.php.net/stream_set_timeout
//$errno == "10060"
Это только для windows | |
|
|
|
|
|
|
|
для: Artem S.
(05.03.2006 в 15:40)
| | А как здесь можно применить функцию stream_set_timeout?
Что-то я ее и так и сяк крутил - все никак не получается. | |
|
|
|
|
|
|
|
для: 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";
?> | |
|
|
|
|
|
|
|
для: Artem S.
(05.03.2006 в 17:33)
| | Спасибо. Буду пробовать | |
|
|
|