我想停止一个simplexml_load_file,如果它需要很长时间才能加载和/或无法访问(偶尔会有xml的网站发生故障),因为我不希望我的网站完全滞后如果他们没有。
我试着尝试一下自己,但是没有设法让任何事情发挥作用。
非常感谢你提前帮忙!
答案 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);