2011-02-01 10 views
1

外部ソースからXMLデータをロードしている私のホームページ上で動作するウィジェットがあります。私はx秒後にXMLロードをタイムアウトしたい(最近、他のサイトに負荷の問題がある)。ここに私がこれまで持っていた機能があります。私は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

私が代わりに直接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

今後の読者:このソリューションでは間違っていた小さなものが2つしかありませんでした。訂正については私の答えを見てください。 – JakeParis

+0

実際には間違っていませんでした。私は単純なxml関数を使用しません( 'simplexml_ import_dom'以外)。私は常にオブジェクトを直接使用します。それはスタイルの好みのことだ。 'new SimpleXmlElement'は' simplexml_load_string'と同じように動作します。次に、私はfalseの代わりにnullを返すことを好む。だから、正しい/間違ったことの問題ではなく、その優先事項の問題:-) – prodigitalson

0

あなたが最初(のようにfopen、fsockopenのか、カールいくつかのブロックまたはより信頼性の高い機能を持つファイルの内容を読むことができます、あなたが使うことができる最高を選択)して、ですから、のタイムアウトを設定する代わりに、 simplexml_load_file

4

のをsimplexml_load_string にコンテンツを渡します。あなたは、具体的にそれを設定することはできませんが、あなただけの機能を使用する前に、(すべてのソケットベースのストリームのための)グローバルに設定することができます。

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'); 
関連する問題