Php 超时脚本部分并允许其余部分继续
我的主页上运行着一个小部件,它从外部源加载xml数据。我想在x秒后超时xml加载最近另一个站点出现加载问题。这是我到目前为止的函数。我不知道如何使计时器与simplexml\u load\u文件一起工作 我走对了吗?有没有办法让这一切顺利进行?还是有更好的方法?如果超时,我仍然需要页面的其余部分继续加载,所以我不能使用set_time_limit,因为这将结束所有脚本的执行,对吗Php 超时脚本部分并允许其余部分继续,php,timer,timeout,simplexml,Php,Timer,Timeout,Simplexml,我的主页上运行着一个小部件,它从外部源加载xml数据。我想在x秒后超时xml加载最近另一个站点出现加载问题。这是我到目前为止的函数。我不知道如何使计时器与simplexml\u load\u文件一起工作 我走对了吗?有没有办法让这一切顺利进行?还是有更好的方法?如果超时,我仍然需要页面的其余部分继续加载,所以我不能使用set_time_limit,因为这将结束所有脚本的执行,对吗 function timer($end) { $count = 0; while($end >
function timer($end) {
$count = 0;
while($end > $count) {
sleep(1);
$count++;
}
return true;
}
$we = simplexml_load_file('http://forecast.weather.gov/MapClick.php?lat=44.08920&lon=-70.17250&FcstType=xml');
if(timer(3)) return;
我会使用CURL而不是直接加载URL
function getXml($url, $timeout = 0){
$ch = curl_init($url);
curl_setopt_array($ch,array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => (int) $timeout
));
if($xml = curl_exec($ch)){
return new SimpleXmlElement($xml);
}
else {
return null;
}
}
//Example
$xmlData = getXml('http://yoururl.com', 2); // 2 second timeout
我会使用CURL而不是直接加载URL
function getXml($url, $timeout = 0){
$ch = curl_init($url);
curl_setopt_array($ch,array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => (int) $timeout
));
if($xml = curl_exec($ch)){
return new SimpleXmlElement($xml);
}
else {
return null;
}
}
//Example
$xmlData = getXml('http://yoururl.com', 2); // 2 second timeout
您可以首先使用某些阻止或更可靠的函数(如fopen、fsockopen或curl)读取文件内容,选择您可以使用的最佳函数,然后将内容传递给simplexml\u load\u string,而不是simplexml\u load\u file您可以首先使用某些阻止或更可靠的函数(如fopen)读取文件内容,fsockopen或curl,选择可以使用的最佳值,然后将内容传递给simplexml\u load\u字符串,而不是simplexml\u load\u文件,因此您希望为simplexml\u load\u文件设置超时。您不能专门设置它,但可以在使用该函数之前为所有基于套接字的流全局设置它:
ini_set('default_socket_timeout', 3);
$we = simplexml_load_file($url);
// you can restore the default value after use, if you want
ini_restore('default_socket_timeout');
因此,您希望为simplexml\u加载\u文件设置超时。您不能专门设置它,但可以在使用该函数之前为所有基于套接字的流全局设置它:
ini_set('default_socket_timeout', 3);
$we = simplexml_load_file($url);
// you can restore the default value after use, if you want
ini_restore('default_socket_timeout');
timer3将在simplexml\u加载\u文件完成后启动。根据simplexml\u load\u文件的行为,可能只有在下载xml文件后才会执行睡眠。@Spliff,我知道,但我不确定如何防止。timer3将在simplexml\u load\u文件完成后启动。根据simplexml\u load\u文件的行为,可能只有在下载xml文件后才会执行睡眠。@Spliff,我知道,但我不确定如何防止这种情况。事实上,它们并没有错。除了simplexml\uuImport\uDOM之外,我从不使用简单的xml函数,我总是直接使用对象。这是一种风格偏好。新的SimpleXmlElement应该像simplexml\u load\u字符串一样工作。其次,我也更喜欢返回null而不是false。因此,这不是一个正确/不正确的问题,而是一个偏好的问题:-@JakeParis你的评论没有帮助,因为你在下面或任何地方都没有答案。这个答案对我不起作用。事实上他们没有错。除了simplexml\uuImport\uDOM之外,我从不使用简单的xml函数,我总是直接使用对象。这是一种风格偏好。新的SimpleXmlElement应该像simplexml\u load\u字符串一样工作。其次,我也更喜欢返回null而不是false。因此,这不是一个正确/不正确的问题,而是一个偏好的问题:-@JakeParis你的评论没有帮助,因为你在下面或任何地方都没有答案。这个答案对我不起作用。