【问题标题】:Can I bypass an XML load file if it timeouts or can't load?如果 XML 加载文件超时或无法加载,我可以绕过它吗?
【发布时间】:2014-08-14 08:48:59
【问题描述】:

我正在读取一个 XML 文件并使用 new simplexmlelement 加载它。

有时,由于 XML 文件在远程服务器上,可能需要很长时间才能加载,有时如果远程服务器关闭,则根本无法加载。

最初我是这样加载 XML 的:

$url = file_get_contents('PATH_TO_XML');
$xml = new SimpleXmlElement($url);

所以我想想出一种方法,如果 XML 文件响应时间过长,或者根本无法加载,PHP 会绕过它,加载网站的其余部分,然后产生一个简单的错误消息,无论站点上引用 XML 文件的任何位置。

所以我上网阅读,并将其添加到代码中:

$context = stream_context_create(array(
    'http' => array(
        'method' => 'GET',
        'timeout' => 10,
    )
));
$url = file_get_contents(PATH_TO_XML', false, $context);
$xml = new SimpleXmlElement($url);

但我的问题是,即使这样,在我的 WAMP 环境中运行时我也会收到以下错误:

Warning: file_get_contents(http://www.inveroak.co.uk/readerimages/livepanel/91221.xml): failed to open stream: HTTP request failed! HTTP/1.1 503 Service Unavailable in C:\wamp\www\clairvoyant\extras\get-readers.php on line 10

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\wamp\www\clairvoyant\extras\get-readers.php on line 11

Exception: String could not be parsed as XML in C:\wamp\www\clairvoyant\extras\get-readers.php on line 11

get-readers.php #10:

$url = file_get_contents('http://www.inveroak.co.uk/readerimages/livepanel/91221.xml', false, $context);

get-readers.php #11:

$xml = new SimpleXmlElement($url);

我有什么遗漏吗?我是否需要调整网站其他地方的参考点?

【问题讨论】:

    标签: php xml timeout


    【解决方案1】:

    嗯,我想我实际上已经找到了一个很好的方法。

    我正走在正确的轨道上,我确实需要为包含 get-readers.php 文件的网站的每个部分添加一个条件。

    所以我所做的就是将这个添加到 get-readers.php:

    // create the context
    $arContext['http']['timeout'] = 0;
    $context = stream_context_create($arContext);
    
    // fetch XML
    $url = @file_get_contents('http://www.inveroak.co.uk/readerimages/livepanel/91221.xml', false, $context);
    $xmlMsg = '';
    
    if($url === false) { $xmlMsg = "
    <div class='xmlError'>
        <span class='title'>Oh no, something's gone wrong!</span>
        <span>We're having trouble showing our available readers at the moment. This is usually only a temporary issue though, and we promise we are working on it!</span><br>
        <span>You can still book a reading by phoning one of our trained operators!</span>
        <div class='action'><div class='inside silver'><span>Pay by card</span>Call <span class='number'>".variable('local_no')."</span> and pay over the phone using a credit or debit card</div></div>
        <div class='action'><div class='inside green'><span>Pay by phone</span>Call <span class='number'>".variable('prem_no')."</span> and pay using your phone bill. It's quick and easy!</div></div>
        <span class='small'>0906 calls cost £1.53/min + network extras. <a href='/terms-conditions'>Full terms &amp; conditions</a></span>
    </div>
    "; } else { $xml = new SimpleXmlElement($url); } // If XML can't be loaded, show error message
    

    然后在每个地方我都包含 get-readers.php,在包含之后是一个 foreach,用于从 XML 内容中获取一个数组。

    我将其放入基于if($xml)IF 语句中。在该行的正上方,我回显了$xmlMsg 以显示错误消息(如果已设置)。 (如果加载了 XML 文件,则消息设置为 '';

    希望对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多