PHP ile uzak bir XML veri alma

3 Cevap php

Şu anda PHP (SimpleXML) ile düzenli olarak güncellenen bir XML dosyası okuyorum.

Ben bir süre sonra, uzaktaki dosyanın yeni bir kopyasını almak, sonra benim web sunucusu üzerinde bir önbellek dosyası okuyarak uzak sunucuya çağrı azaltmak istiyorum.

Bu ayrıştırma, sonra uzaktan XML dosyalarını okumak için kabul edilebilir bir uygulama mı? Herkes PHP bu konuda gitmek için bazı öneriler sunmak, ya da belki de bu anlaşma bazı ARMUT sınıfları vardır miyim?

3 Cevap

Evet, uzaktan kaynakları ile ilgili ne zaman bir tavsiye biri, kabul edilen bir uygulama daha bulunuyor.

Orada PEAR ve diğer kitaplıkları genel amaçlı önbellek yöneticileri vardır, ama sizin durumda basit bir ev yapımı çözüm sadece de çalışmak. Bunun gibi bir şey:

function get_xml($url, $max_age)
{
    $file = '/path/to/cache/dir/' . md5($url);

    if (file_exists($file)
     && filemtime($file) >= time() - $max_age)
    {
        // the cache file exists and is fresh enough
        return simplexml_load_file($file);
    }

    $xml = file_get_contents($url);
    file_put_contents($file, $xml);
    return simplexml_load_string($xml);
}

Eğer copy() kaynak almak için kullanabilirsiniz, bunu düşünmek gel. Çoğu durumda herhangi bir fark olmaz ama dış kaynak sadece çok büyük olarak gerçekleşmesi eğer PHP'nin bellek yöneticisi biraz daha yumuşaktır. Eğer bellek büyük bir XML yükleme eğer Ama o zaman bile, bunu indirebilirsiniz şekilde daha büyük sorunları var :)

function get_xml($url, $max_age)
{
    $file = '/path/to/cache/dir/' . md5($url);

    if (!file_exists($file)
     || filemtime($file) < time() - $max_age)
    {
        // the cache file doesn't exists or is not fresh enough
        copy($url, $file);
    }

    return simplexml_load_file($file);
}

Oh, ve neredeyse unutuyordum. Bunu yapmak için daha iyi, daha kolay bir yolu var bazı cron özelliği erişiminiz varsa. Sadece kayıtsız şartsız o uzak kaynak her 5 veya 10 dakika karşıdan bir cron işi kurmak. Sonra, PHP komut koşulsuz önbellek dosyasından okunur ve tüm uzak kaynak hakkında rahatsız etmeyelim. Bu şekilde, gecikme açısından hiçbir "en kötü durum" senaryosu var. Aksi takdirde, her script o kullanıcının o önbellekten zorlama var ise noticably daha bekleyin yapar, önbelleği yeniler.

Belki böyle bir şey? Hiçbir önbellek dosyası veya önbellek süresi ise (on dakika daha eski bu durumda) eğer sunucudan XML dosyasını getir.

$filename = 'myxmlfile.xml';
if(!file_exists("cache/$filename") || filemtime("cache/$filename") - time() > 600) {
  $f1 = fopen("http://example.com/rss.xml", 'r');
  $f2 = fopen("cache/$filename", 'w');
  while(!feof($f1)) {
    fwrite($f2, fread($f1, 8192));
  }
  fclose($f1);
  fclose($f2);
}

$doc = simplexml_load_file("cache/$filename");

Eğer AS3 (ActionScript 3) ile Flash kullanıyorsanız size verilen adrese bir URLRequest gibi bir şey yapabilirim ...

Ben zaten PHP dosyası var supose ...

diyelim gibi bir şeydir sağlar

<?php
 $lstrXML = "";
 $lstrXML .= "<?xml version="1.0"?>";
 $lstrXML .= "<root>";
 $lstrXML .= "<node1>";
 $lstrXML .= "<data cd='1' ds='a' />";
 $lstrXML .= "<data cd='1' ds='a' />";
 $lstrXML .= "<data cd='1' ds='a' />";
 $lstrXML .= "<data cd='1' ds='a' />";
 $lstrXML .= "</node1>";
 $lstrXML .= "</root>";

 echo($lstrXML);
?>

Ve AS3 ... bir yerlerde ...

var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("xmltest.php"));
function LoadXML(e:Event):void
{
    xmlData = new XML(e.target.data);
}