Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 超时脚本部分并允许其余部分继续_Php_Timer_Timeout_Simplexml - Fatal编程技术网

Php 超时脚本部分并允许其余部分继续

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 >

我的主页上运行着一个小部件,它从外部源加载xml数据。我想在x秒后超时xml加载最近另一个站点出现加载问题。这是我到目前为止的函数。我不知道如何使计时器与simplexml\u load\u文件一起工作

我走对了吗?有没有办法让这一切顺利进行?还是有更好的方法?如果超时,我仍然需要页面的其余部分继续加载,所以我不能使用set_time_limit,因为这将结束所有脚本的执行,对吗

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你的评论没有帮助,因为你在下面或任何地方都没有答案。这个答案对我不起作用。