кэширование объектов php simplexml

#php #xml #caching #rss

#php #xml #кэширование #RSS-канал

Вопрос:

Рассмотрим следующий прототип функции для кэширования объекта из кэшированного канала 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:xampphtdocssitefinalcacheObject.php:20 Stack trace: #0 C:xampphtdocssitefinalcacheObject.php(20): serialize(Object(SimpleXMLElement)) 
  

Мы будем признательны за любую помощь в работе этой программы.

Ответ №1:

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

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

Комментарии:

1. Не могли бы вы привести пример кода процедуры в этом случае, пожалуйста

2. Если объект не может быть сериализован, вы действительно можете кэшировать только ответ канала. Что, я бы сказал, меняет вопрос.

Ответ №2:

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