如何中断花费太长时间的PHP函数?

时间:2014-03-14 18:00:58

标签: php xml windows function

我想停止一个simplexml_load_file,如果它需要很长时间才能加载和/或无法访问(偶尔会有xml的网站发生故障),因为我不希望我的网站完全滞后如果他们没有。

我试着尝试一下自己,但是没有设法让任何事情发挥作用。

非常感谢你提前帮忙!

2 个答案:

答案 0 :(得分:2)

在指定时间后,您无法退出任意功能。你可以做的是首先尝试加载URL的内容 - 如果成功,继续处理脚本的其余部分。

有几种方法可以实现这一目标。最简单的方法是将file_get_contents()与流上下文集一起使用:

$context = stream_context_create(array('http' => array('timeout' => 5)));

$xmlStr = file_get_contents($url, FALSE, $context);
$xmlObj = simplexml_load_string($xmlStr);

或者您可以通过simplexml_load_file()函数使用libxml_set_streams_context()的流上下文:

$context = stream_context_create(array('http' => array('timeout' => 5)));

libxml_set_streams_context($context);
$xmlObj = simplexml_load_file($url);

你可以把它包装成一个很好的小函数:

function simplexml_load_file_from_url($url, $timeout = 5)
{
    $context = stream_context_create(
        array('http' => array('timeout' => (int) $timeout))
    );
    $data = file_get_contents($url, FALSE, $context);

    if(!$data) {
        trigger_error("Couldn't get data from: '$url'", E_USER_NOTICE);
        return FALSE;
    }

    return simplexml_load_string($data);
} 

或者,您可以考虑使用cURL(默认情况下可用)。使用cURL的好处是可以对请求进行非常精细的控制以及如何处理响应。

答案 1 :(得分:1)

您应该使用stream context timeout选项并加file_get_contents

$context = stream_context_create(array('http' => array('timeout' => 5))); //<---- Setting timeout to 5 seconds...

现在将其映射到您的file_get_contents

$xml_load = file_get_contents('http://yoururl', FALSE, $context);
$xml = simplexml_load_string($xml_load);