2011-10-17 9 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

おそらくmany built-in PHP objects, cannot be serializedのようなSimpleXMLElementクラスです。

代わりに、クラスメソッドasXML(パラメータを渡さないと有効なXML文字列を返します)を呼び出してこれをシリアル化できます。この文字列でsimplexml_load_string()を呼び出して、SimpleXMLElementクラスを再作成することができます。

+0

この場合、手順のコード例を教えてください。 – George

+0

オブジェクトをシリアル化できない場合は、実際にはフィードの応答しかキャッシュできません。私はどちらが質問を変更すると主張するでしょう。 –

0

Magpiers(フリーオープンソース)は、外部のXMLファイルをキャッシュすることになっています。私は数年前にそれを使いました。このソフトウェアを時間枠に設定して、xmlファイルを再度プルします。それはうまくいった。私が見た問題は、フロントエンドの要求があったかどうかにかかわらず、xmlファイルを引き出していたかどうかということでした。私はそれについての修正があるかもしれないと思う。がんばろう。