Выделение части скрипта и продолжение остальных - PullRequest
1 голос
/ 01 февраля 2011

У меня есть виджет, который запускается на моей домашней странице и загружает данные XML из внешнего источника.Я хочу, чтобы тайм-аут загрузки XML через x секунд (в последнее время проблемы с загрузкой на другом сайте).Вот функция, которую я имею до сих пор.Я не могу понять, как заставить таймер работать без simplexml_load_file().

Я на правильном пути?Есть ли способ сделать эту работу?Или есть лучший способ сделать это?Если это делает тайм-аут, мне все еще нужна остальная часть страницы, чтобы продолжить загрузку, поэтому я не могу использовать 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;

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Итак, вы хотите установить таймаут для simplexml_load_file(). Вы не можете установить его конкретно, но вы можете просто установить его глобально (для всех потоков на основе сокетов) перед использованием функции:

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');
3 голосов
/ 01 февраля 2011

Я бы использовал 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
0 голосов
/ 01 февраля 2011

Сначала вы можете прочитать содержимое файла с помощью некоторой блокирующей или более надежной функции (например, fopen, fsockopen или curl, выбрать лучшее, что можете использовать), а затем передать содержимое в simplexml_load_string вместо simplexml_load_file

...