JustinBieber
@JustinBieber
Звизда

Почему если источник при парсинге не работает, то сайт тоже не работает?

Парсим курс валюты с нацбанка, вчера сайт нацбанка не работал и из-за этого перестает работать сайт который парсит.
Если например указать источник неправильно, то на сайте показывает по нулям. Почему если источник не был доступен, не показывало на сайте по нулям?

<?php  
     
    $sContent  = file_get_contents("http://www.nationalbank.kz/rss/rates_all.xml", "r");
    $oXml = simplexml_load_string($sContent);
    $iUSD = 0;
    $iRUR = 0;
    $iEUR = 0;
    foreach($oXml->channel->item AS $oValue) { 
        if ($oValue->title == "USD") { 
            $iUSD = $oValue->description; 
        } 
        if ($oValue->title == "RUB") { 
            $iRUB = $oValue->description; 
        } 
        if ($oValue->title == "EUR") { 
            $iEUR = $oValue->description; 
        } 
    } 
     
    echo "<span>USD " . $iUSD . "</span>";
    echo "<span>RUB " . $iRUB . "</span>";
    echo "<span>EUR " . $iEUR . "</span>";
?>
  • Вопрос задан
  • 226 просмотров
Пригласить эксперта
Ответы на вопрос 4
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Читайте логи, там всё написано.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
потому, что это находится в одном потоке, а там исполнение кода - всегда асинхронное.
1. парсите и кэшируйте.
2. обрабатывайте ошибки
3. используйте кэш при ошибках
Ответ написан
Комментировать
@neol
Потому что default_socket_timeout в PHP равен 60 (секундам), а максимальное время выполнения file_get_contents зависит от этого параметра. Соответственно если сайт, с которого вы дёргаете информацию, лежит, то запросы к вашему сайту возвращают ответ только после истечения этого таймаута.

Любой PHP код, взаимодействующий с сетью, желательно выносить в задачи, выполняемые через cli по cron (хотя не всегда это возможно, например при авторизации через сторонний сервис), а на сайт выводить кешированые результаты. При этом стоит делать проверки, что этот код не запустится 100500 раз.

Плюс к этому у вас нет проверок, что file_get_contents и simplexml_load_string возвращают корректный результат.
Ответ написан
Комментировать
Завершается скрипт наверное когда данных нет.
Поставьте $sContent = @file_get_contents или в if оберните
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы