2010-05-29 5 views
0

Я сейчас читаю регулярно обновляемый XML-файл с PHP (simpleXML).Получить удаленные данные XML с помощью PHP

Я хотел бы сократить вызовы на удаленный сервер, прочитав файл кеша на моем веб-сервере, а затем через некоторое время вернет новую копию удаленного файла.

Является ли это принятой практикой для чтения удаленных файлов XML, а затем синтаксический анализ? Может ли кто-нибудь предложить некоторые предложения о том, как это сделать на PHP, или, возможно, есть некоторые классы PEAR, которые справляются с этим?

+0

ли удаленный серв er как-то указать, как долго вы можете/должны кэшировать ресурс? – VolkerK

+0

Нет, мне просто интересно, как люди склонны справляться с этим. Я думаю, что вкладка cron - это, вероятно, путь. – rrrfusco

ответ

2

Да, это более чем приемлемая практика, это рекомендуется при работе с удаленными ресурсами.

В руководстве PEAR и других librairies есть универсальные менеджеры кэшей, но в вашем случае простое домашнее решение будет работать так же хорошо. Нечто подобное:

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); 
} 

Давай думать об этом, вы можете использовать copy() получить ресурс. В большинстве случаев это не имеет никакого значения, но немного более мягко относится к менеджеру памяти PHP, если внешний ресурс просто очень большой. Но даже тогда, если вы загружаете огромный XML в памяти у вас есть большие проблемы, чем то, как вы его скачать :)

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); 
} 

О, и я почти забыл. Это лучший и простой способ сделать это, если у вас есть доступ к некоторой функции cron. Просто настройте задание cron, которое безостановочно загружает этот удаленный ресурс каждые 5 или 10 минут. Затем пусть ваш PHP-скрипт безоговорочно прочитает из файла кеша и вообще не беспокоится о удаленном ресурсе. Таким образом, сценарий «наихудшего случая» с точки зрения латентности отсутствует. В противном случае каждый раз, когда ваш скрипт обновляет ваш кеш, он заставляет пользователя ждать заметно больше, чем если бы он был извлечен из кеша.

+0

Не выполняет ли crontab запланированные задачи? Вы предлагаете ему называть copy() каждые n минут? Наверное, я не понимаю «безоговорочно» Имеет ли crontab функции копирования? – rrrfusco

+0

«безоговорочно» означает «независимо от каких-либо обстоятельств» или, другими словами, «всегда». Каждые 5 минут вы обновляете файл, несмотря ни на что. Что касается crontab, он выполняет все. Вы можете заставить его запустить 'wget -O /path/to/cache/file.xml http: // url.test' или запустить скрипт PHP, который извлекает ресурс. –

0

Возможно, что-то вроде этого? Извлеките XML-файл с сервера, если нет файла кеша или срок действия кеша истек (в этом случае более десяти минут).

$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"); 
0

Если вы используете Flash, с AS3 (ActionScript 3) вы могли бы сделать что-то вроде URLRequest к данному адресу ...

Я supose у вас есть уже файл PHP ...

позволяет говорить это что-то вроде

<?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); 
?> 

И в AS3 ... где-то ...

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); 
} 
Смежные вопросы