#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-файл, независимо от того, был ли для него запрос внешнего интерфейса или нет, который использовал сервер. Однако я думаю, что это может быть исправлено. Удачи.