2012-09-13 18 views
5

Mam ten skrypt, który generuje kanał RSS. Chcę, żeby to była próba osiągnięcia adresu rss przez około 5 sekund, a jeśli nie, to chcę załadować kopię zapasową dokumentu xml, który znajduje się na serwerze. To jest to, co mam i to nie działa:Ustaw limit czasu na pliku simplexml_load_file

<?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 />'; 
    } 
} 

?> 

Otrzymuję błąd przekroczenia limitu czasu i to wszystko. Każdy wgląd byłby świetny!

Odpowiedz

0

To co mam pracy:

<?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 />'; 
     } 
    } 

    ?> 
0

Od 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; 
    } 

} 
?> 
1

Jest to znacznie lepsze rozwiązanie wskazał @AnthonySterling here:

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); 
} 
+0

Poprawione tworzenie kontekstu . Niestety nie mam już żadnych limitów czasu, czy istnieje strona testowa, która po prostu ma długi czas oczekiwania? – Daniel

+0

Masz to, możesz przetestować kod, dzwoniąc do php zawierającego polecenie "sleep (45);". – Daniel

+1

Aby uwzględnić również limit czasu gniazda, istnieje zmienna do ustawienia żądanej wartości: 'ini_set ('default_socket_timeout', 5);' Więcej informacji [tutaj] (http://stackoverflow.com/a/10236480) – jap1968