Использование simplexml_load_file для извлечения из tumblr — тайм-аут каждый раз

Мой сайт загружается примерно 45 секунд. Это потому, что я извлекаю некоторый XML из tumblr, но я не могу понять, является ли это ошибкой моего сервера, ошибкой tumblr или каким-то другим фактором. Могу ли я заставить этот скрипт истечь через 5 секунд и вывести сообщение «tumblr is down»; вместо того, чтобы просто тайм-аут через почти минуту?

Я получаю эту ошибку:

Предупреждение: simplexml_load_file(http://blog.yaytalent.com/api/read?type=post&start=1&num=2) [function.simplexml-load-file]: не удалось открыть поток: истекло время ожидания подключения в /nfs/c08/ h02/mnt/122191/domains/yaytalent.com/html/index.php в строке 86

Предупреждение: simplexml_load_file() [function.simplexml-load-file]: предупреждение ввода-вывода: не удалось загрузить внешний объект "http://blog.yaytalent.com/api/read?type=post&start=1&num=2" в / nfs/c08/h02/mnt/122191/domains/yaytalent.com/html/index.php в строке 86

С этим кодом:

<?php
$request_url = "http://blog.yaytalent.com/api/read?type=post&start=1&num=2";
$xml = simplexml_load_file($request_url);
$title = $xml->posts->post->{'regular-title'};
$post = $xml->posts->post->{'regular-body'};
$link = $xml->posts->post['url'];
$small_post = substr($post,0,270);
echo "<h2><a target=frame2 href='".$link."'>$title</a></h2>";
echo "<p>$small_post... <a target=frame2 href='$link'>Read More</a></p>";
?>

person mike    schedule 11.05.2011    source источник
comment
если частота изменений в документе, который вы извлекаете, не слишком часта, возможно, вы можете сохранить его в таблице БД и время от времени обновлять с помощью cron или планировщика.   -  person Ibu    schedule 11.05.2011
comment
Ибу: Спасибо, но я дизайнер с некоторыми навыками работы с интерфейсом. Писать что-то подобное мне не по силам.   -  person mike    schedule 11.05.2011


Ответы (3)


хорошо, в этом случае я могу предложить вам использовать cUrl

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

            $url = "http://blog.yaytalent.com/api/read?type=post&start=1&num=2";
            $ch = curl_init(); 
            curl_setopt($ch, CURLOPT_URL, $url); 
            curl_setopt($ch, CURLOPT_HEADER, FALSE); 
            curl_setopt($ch, CURLOPT_NOBODY, FALSE); 
            curl_setopt($s,CURLOPT_TIMEOUT,5); // TIME OUT is 5 seconds
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
            $response = curl_exec($ch); 
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
            curl_close($ch); 

Я надеюсь, что это сработает для вас и удачи в вашем обучении

ОБНОВЛЕНИЕ:

теперь вы можете использовать свой простой xml следующим образом:

$xml = simplexml_load_string($response);

person Ibu    schedule 11.05.2011
comment
Кажется, теперь это работает, я думаю, что, возможно, API Tumblr вызывал проблему в первую очередь. Мой исходный код снова работает. - person mike; 11.05.2011
comment
очень хорошо, как вы понимаете, cUrl — лучшая альтернатива simplexml_load_file(), которая использует метод, аналогичный методу file_get_contents. cUrl также быстрее - person Ibu; 11.05.2011

Вы также можете сделать это следующим образом:

function simplexml_load_file_from_url($url, $timeout = 20){

  $context = array('http' => array('timeout' => (int)$timeout));

  $data = file_get_contents($url, false, stream_context_create($context));

  if(!$data){
    trigger_error('Cannot load data from url: ' . $url, E_USER_NOTICE);
    return false;
  }

  return simplexml_load_string($data);
}  
person Carca    schedule 09.05.2014

curl_setopt(**$s**,CURLOPT_TIMEOUT,5);

Здесь должен быть $ch в ответ на Ibu я думаю. Но в любом случае хороший пример! Спасибо!

person Pavel    schedule 03.09.2014