PHPSimpleXMLElementのserializeに関して

December 30, 2008,
tags: php simplexmlelement unserialize エラー


このエントリーをはてなブックマークに追加

ほかサイトからXMLでデータをもらってくる場合に、毎回毎回XMLを取得しに行くのって結構重くなりますよね。
まあボクの学科の一番偉い先生はそこらへん考えてなさそうだけど・・・あーでも、アクセスしてみた感じキャッシュしているのかなぁ。わからないw

そこでキャッシュさせて、一定時間越えたらとりにいくようにしようと思ったわけです。
考え方としては

キャッシュファイルを確認

古ければ、XMLを取得 → キャッシュの有効期限以内なら、キャッシュファイル読み込んで,unserializeして配列に入れる
        ↓               ↓
シリアライズしてキャッシュファイルに保存

表示

若干わかりづらいですが、まあこんな感じにプログラムを書いたわけです。
そしたら・・・unserialize時にエラーが・・・。
どうやらググってみたところ、ほかの人も同じようなエラーが出る人がいました。

どうやら、serialize時におかしくなるようですが・・・よくわかりませんw
PHPマニュアルのほうに修正方法書いてあったけど・・・よくわかりませんw
むしろ誰か教えてくださいw

とりあえず、ボクの回避策は、XMLデータとして書き出してキャッシュするって方法にしました。
うーん本当はserializeしたかったんだけどなぁ、残念・・・。

全部じゃないけど一部だけソースコード公開しておきます。

<?php
class APIcache
{
    public $cache_file = "cache.php";
    public $cache_path = '';
    public $cache_life_time = 3600;
    public $cache_data = '';

    /**
    * 取得したxmlのキャッシュを作成
    */
    protected function writeCache($xml_string='',$cache_file='',$cache_path=''){

        if(empty($cache_file) || empty($cache_path)){
            return false;
        }

        if($this->checkCacheTime($cache_file,$cache_path)){
            $handle = fopen($cache_file,"w");
            fwrite($handle,$xml_string);
            fclose($handle);
        }

        return true;
    }

    /**
    * キャッシュを読み込み
    */
    protected function readCache($cache_file="",$cache_path=''){
        if(empty($cache_file)){
            return false;
        }
        if(empty($cache_path)){
            return false;
        }

       if(!$this->checkCacheTime($cache_file,$cache_path)){
            $file_name = $cache_path."/".$cache_file;
            $this->cache_data =  simplexml_load_file($file_name);
            return true;
        }
        return false;
    }


    /**
    * キャッシュファイルの更新時間を確認
    */
    protected function checkCacheTime($cache_file='',$cache_path=''){
        $filename = $cache_path."/".$cache_file;
        $now = mktime();

        if(!file_exists($filename)){
            return  true;
        }
        $time = filemtime($filename);
        $cache_time = $time + $this->cache_life_time;
        print_br(date("Y-m-d H:i:s",$cache_time));
        print_br(date("Y-m-d H:i:s",$now));
        print_br("");

        print_br("cache_time:$cache_time - now::$now");
        print_br($cache_time - $now);
        if( $cache_time < $now){
            return true;
        }
        return false;
    }

}
?&>

なんか力いっぱいで書いた感じなんで、また書き直します。

comments powered by Disqus