2011-02-01 2 views
1

У меня есть виджет, который запускается на моей домашней странице, которая загружает XML-данные из внешнего источника. Я хочу отключить xml-загрузку через x секунд (в последнее время на другом сайте возникают проблемы с загрузкой). Вот функция, которую я имею до сих пор. Я не могу понять, как сделать таймер ineract с 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; 
+0

таймер (3) начнется после того, как simplexml_load_file() закончена. в зависимости от поведения simplexml_load_file() sleep, вероятно, будет выполняться только после загрузки файла xml. – Spliffster

+0

@Spliff, я знаю, но я не был уверен, как это предотвратить. – JakeParis

ответ

3

Я хотел бы использовать 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

Будущий читатель: в этом решении было всего несколько мелких вещей. См. Мой ответ ниже для исправления. – JakeParis

+0

На самом деле они не были неправильными. Я никогда не использую простые функции xml (кроме 'simplexml_ import_ dom'), я всегда использую объект напрямую. Это стиль предпочтения. 'new SimpleXmlElement' должен работать так же, как' simplexml_load_string'. Во-вторых, я также предпочитаю возвращать null вместо false. Так что это не вопрос правильного/неправильного его вопроса предпочтения :-) – prodigitalson

0

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

4

Так что вы хотите установить тайм-аут для 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');