php simplexml кеширование объектов - PullRequest
1 голос
/ 17 октября 2011

Рассмотрим следующий прототип функции для кэширования объекта из кэшированного канала RSS (XML):

function cacheObject($xml,$name,$age = 3600)
  { 
    // directory in which to store cached files
    $cacheDir = "cache/";
    // cache filename
    $filename = $cacheDir.$name;
    // default to fetch the file
    $cache = true;
    // but if the file exists, don't fetch if it is recent enough
    if (file_exists($filename))
    {
      $cache = (filemtime($filename) < (time()-$age));
    }
    // fetch the file if required
    if ($cache)
    {
      $item = $xml->channel->item;
      file_put_contents($filename,serialize($item));
      // update timestamp to now
      touch($filename);
    }
    // return the cache filename
    return unserialize(file_get_contents($filename));
  }   

Функциональные вызовы следующие:

$urlD = "http://somerss.php";
    $xmlD = simplexml_load_file(cacheFetch($urlD,'cachedfeedD.xml',3600));
    $itemD = '';
    if($xmlD === FALSE)
        {$itemD = '';}
    else
        {$itemD = cacheObject($xmlD,'cacheobjectD',3600);}
 $urlM = "somerss2.php";
    $xmlM = simplexml_load_file(cacheFetch($urlM,'cachedfeedM.xml',3600));
    $itemM = '';
    if($xmlM ===  FALSE) 
        {$itemM = '';}
    else
        {$itemM = cacheObject($xmlM,'cacheobjectM',3600);}

Я получаю следующую ошибку:

    Fatal error: Uncaught exception 'Exception' 
with message 'Serialization of 'SimpleXMLElement' is not allowed' in C:\xampp\htdocs\sitefinal\cacheObject.php:20 Stack trace: #0 C:\xampp\htdocs\sitefinal\cacheObject.php(20): serialize(Object(SimpleXMLElement)) 

Любая помощь, заставляющая эту программу работать, очень ценится.

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Вероятно, класс SimpleXMLElement , как и многие встроенные объекты PHP, не может быть сериализован .

Вместо этого вы можете вызвать метод класса asXML (который возвращает допустимую строку XML, если вы не передаете никаких параметров) и сериализовать его. Затем вы можете воссоздать класс SimpleXMLElement, вызвав simplexml_load_string () для этой строки.

0 голосов
/ 22 октября 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...