2011-10-17 146 views
1

考慮下面的函數原型爲緩存對象從緩存RSS(XML)飼料:PHP的SimpleXML對象緩存

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

任何幫助使這個程序的工作非常感謝。

回答

3

可能是SimpleXMLElement類,例如many built-in PHP objects, cannot be serialized

相反,您可以調用類方法asXML(如果不傳遞參數,它將返回有效的XML字符串)並對其進行序列化。然後,您可以通過在此字符串上調用simplexml_load_string()來重新創建SimpleXMLElement類。

+0

您可以舉一些這種情況下的程序代碼示例,請 – George

+0

如果該對象無法序列化,您實際上只能緩存該提要的響應。我爭論的是改變這個問題。 –

0

Magpiers(免費開源)應該緩存外部xml文件。幾年前我用過它。您將軟件設置爲一個時間範圍以再次提取xml文件。它運作良好。我看到的唯一問題是,它一直在拉取xml文件,無論是否有前端請求,或者沒有使用服務器。不過,我認爲可能會有解決方案。祝你好運。