Ключевые моменты:
- обработка ошибок при запросе XML;
- таймаут ожидания при запросе XML;
- несколько попыток запроса XML;
- проверка на существование нужных полей в XML;
- запись в лог.
Код: Выделить всё
// Писать логи ( 0-нет, 1-только критические, 2-все )
$reclog = 1;
// Открываем лог, если нужно.
if ($reclog) { $log = getLogger('script.WeatherFromYandex'); }
// Адрес xml файла
$data_file = "http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(1, 1000);
// Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
libxml_use_internal_errors(true);
// Установим контекст потока
$ta = 30; //Таймаут ожидания страницы от Яндекса (секунд)
$ctx = stream_context_create(array('http' => array('timeout' => $ta)));
libxml_set_streams_context($ctx);
$retries = 5; // Число попыток запроса xml у Яндекса
$count = 0; // Счетчик попыток
$xml = false;
while ( ($count !== $retries) && ($xml === false) ) {
if ( $reclog == 2 ) $log->trace('Запрос данных погоды от сервиса Яндекс.Погода. Попытка = ' . $count);
// Получаем xml от Яндекса и раскладываем на массив
$xml = @simplexml_load_file($data_file);
if ( $reclog == 2 ) {
if ( $xml === false ) $log->trace('Запрос данных погоды от сервиса Яндекс.Погода. Неуспешная попытка.');
else $log->trace('Запрос данных погода от Яндекса. Успешная попытка.');
}
// Пауза между попытками
sleep(1);
$count++;
}
if($xml === false) {
if ($reclog) $log->error('Не удалось получить данные от сервиса Яндекс.Погода.');
foreach(libxml_get_errors() as $error) {
if ($reclog) $log->error($error->message);
}
libxml_clear_errors();
}
else {
if( $fact = $xml->fact ) {
// получаем нужные свойства, как раньше
}
if( $day0 = $xml->day[0] ) {
// получаем нужные свойства, как раньше
}
if ( libxml_get_last_error() !== false ) {
if ($reclog) $log->error('Данные от сервиса Яндекс.Погода получены, но возникли ошибки: ');
foreach(libxml_get_errors() as $error) {
if ($reclog) $log->error($error->message);
}
}
libxml_clear_errors();
}