У меня есть этот скрипт, который выводит rss-канал. Хотелось бы, чтобы я попытался достичь rss-url для чего-то вроде 5-секундных вершин, и если он не сможет, я хочу, чтобы он загрузил резервный XML-документ, который находится на сервере. Это то, что у меня есть, и оно не работает:
<?php include '../php/connect.php'; $metaData = mysql_query("SELECT * FROM `siteinfo`") or die("couln't find table :("); $displayData = mysql_fetch_assoc($metaData); $url = $displayData['status']; $xml = file_get_contents($url); stream_set_timeout($xml, 5); if ($xml == FALSE) { $xml = simplexml_load_file('backUpXml.xml'); foreach ($xml->channel->item as $item) { echo '<a href="'.$item->guid.'" alt="'.$item->title.'" target="_blank">', substr($item->title, 0, 62), '...</a><br /><span>', substr($item->pubDate, 4, 18),'</span><br /><hr /><br />'; } } else { $xml = simplexml_load_file($url); foreach ($xml->channel->item as $item) { echo '<a href="'.$item->guid.'" alt="'.$item->title.'" target="_blank">', substr($item->title, 0, 62), '...</a><br /><span>', substr($item->pubDate, 4, 18),'</span><br /><hr /><br />'; } } ?>
Я получаю ошибку таймаута, и все. Любое понимание было бы здорово!
Это гораздо лучшее решение, указанное здесь @AnthonySterling:
function simplexml_load_file_from_url($url, $timeout = 5){ $opts = array('http' => array('timeout' => (int)$timeout)); $context = stream_context_create($opts); $data = file_get_contents($url, false, $context); if(!$data){ trigger_error('Cannot load data from url: ' . $url, E_USER_NOTICE); return false; } return simplexml_load_string($data); }
От php.net :
<?php $fp = fsockopen("www.example.com", 80); if (!$fp) { echo "Unable to open\n"; } else { fwrite($fp, "GET / HTTP/1.0\r\n\r\n"); stream_set_timeout($fp, 2); $res = fread($fp, 2000); $info = stream_get_meta_data($fp); //I think this is what you need. fclose($fp); if ($info['timed_out']) { //So you can check this variable. echo 'Connection timed out!'; } else { echo $res; } } ?>
Это то, что я получил:
<?php include 'php/connect.php' ; $metaData = mysql_query("SELECT * FROM `siteinfo`") or die("couln't find table :("); $displayData = mysql_fetch_assoc($metaData); $url = $displayData['status']; $xml = file_get_contents($url); if (!$xml) { $xml = simplexml_load_file('content/backUpXml.xml'); foreach ($xml->channel->item as $item) { echo '<a href="'.$item->guid.'" alt="'.$item->title.'" target="_blank">', substr($item->title, 0, 62), '...</a><br /><span>', substr($item->pubDate, 4, 18),'</span><br /><hr /><br />'; } } else { $myFile = "content/backUpXml.xml"; $fh = fopen($myFile, 'w') or die("can't open file"); $stringData = $xml; fwrite($fh, $stringData); fclose($fh); $xml = simplexml_load_file($url); foreach ($xml->channel->item as $item) { echo '<a href="'.$item->guid.'" alt="'.$item->title.'" target="_blank">', substr($item->title, 0, 62), '...</a><br /><span>', substr($item->pubDate, 4, 18),'</span><br /><hr /><br />'; } } ?>