SimpleXML - 无法加载某些远程URL

时间:2016-07-21 14:43:15

标签: php xml simplexml

我正在使用SimpleXML来获取远程XML文件,并且我遇到了一些问题,因为有时SimpleXML无法加载XML。我不确切地知道原因,但我怀疑远程站点返回数据的时间比平时要长,导致超时。

我使用的代码如下:

$xml = @simplexml_load_file($url);  

    if(!$xml){      

        $database = Config_helper::get_config_option('mysql');     
        $db = new \DB($database['database'], $database['server'], $database['user'], $database['password']);
        $date = date('Y-m-d H:i:s');

        $db->query("INSERT INTO gearman_job_error (timestamp, data, attempt)
            VALUES ('$date', '{$job->workload()}', '1')");

        //$db->query("INSERT INTO gearman_job_error (timestamp, data, attempt) VALUES ({$date}, {$job->workload()}, 1);");

        return $job->sendFail();                        
    }
    else {      

        foreach($xml->point as $key=>$value):

            $length = count($value);        
            $timestamp = (string) $value->data[0];              

            $j=0;

            for ($i = 1; $i < $length; $i++) 
            {                               
                $forecast[$timestamp][$time_request][] = array($variables[$j] => (string) $value->data[$i]);                        
                $j++;
            }               

        endforeach;                                                         

        return serialize($forecast);            
    }

我无法加载的网址存储在数据库中,通过检查确认它们在浏览器中正确加载..没问题。

示例:http://mandeo.meteogalicia.es/thredds/ncss/modelos/WRF_HIST/d02/2015/02/wrf_arw_det_history_d02_20150211_0000.nc4?latitude=40.393288&longitude=-8.873433&var=rh%2Ctemp%2Cswflx%2Ccfh%2Ccfl%2Ccfm%2Ccft&point=true&accept=xml&time_start=2015-02-11T00%3A00Z&time_end=2015-02-14T20%3A00Z

我的问题是,我怎么能坚持SimpleXML花时间加载网址?我的目标是在合理的时间之后假定它无法加载文件并将其存储在数据库中。

2 个答案:

答案 0 :(得分:0)

simplexml_load_file本身对指定超时没有任何支持,但您可以合并file_get_contentssimplexml_load_string,如下所示:

<?php
$timeout = 30;
$url = 'http://...';

$context = stream_context_create(['http' => ['timeout' => $timeout]]);

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

$xml = simplexml_load_string($data);

print_r($xml);

答案 1 :(得分:0)

我认为这样做的方法现在适合我。

我设置了获取xml的最大尝试次数,如果它不起作用,则表示xml可能已损坏或丢失。

我已经过测试,结果准确无误!它比设置超时更简单,更有效。我猜你也可以随时设置超时。

$maxTries = 5;

do
{     
  $content = @file_get_contents($url);
}
while(!$content && --$maxTries);

if($content)
{
    try
    {
        $xml = @simplexml_load_string($content);        
        # Do what you have to do here #
    }
    catch(Exception $exception)
    {           
        print($exception->getMessage());
    }
}
else
{
    echo $url;      
    $job->sendFail();                       
}