關於 Simplepie cache (db cache)

這篇還是記錄在 StickerAction 的效能上做的處理。 StickerActionSimplepie 來讀取 RSS, 然後用上了 cache, 來避免一直對外部做 request, 也減少流量的支出。研究了一下 Simplepie 的 cache 儲存方式, Simplepie 就是把他所抓取的 url 做 md5 當成檔名存成 cache 檔案, 檔案裡面則是存放 serialize 後的資料。

所以為了搭配上一篇所提到的存取控制, 計算這次是否有對外部做了 request, 所以寫了下面這一段, 來判斷是否有對外存取, 進而做存取控制。

function is_cached($url)  
        $cache_file = 'sp_cache/' . md5($url) . '.spc';
        if (file_exists($cache_file)) {
            return true;
        }

        return false;
}```

不過很不幸的, 目前用的 Simplepie 1.1.1, 對某些網址的 cache 判斷有點問題, 也看到 [StickerAction](http://stickeraction.com) 在 log 檔的記錄, 一直有網址沒有被 cache 到。 另外目前 Simplepie 對於 cache 檔案, 並沒有另外建子目錄來分別存放 cache 檔, 而是全都放在同一個目錄, 搞到最後還得搭配 xargs 才能一次將檔案刪完 XD

後來就跑去看了 Simplepie 的 svn, 有了的 DB cache 的功能, 就抓回來玩看看, 所以目前就將 Simplepie 換成 svn trunk 裡最新的版本 (rev. 995 ), 用 DB 來存放 cache。 不過 Simplepie 所提供的 db.sql 有點怪怪的, 兩個 table 都沒有 primary key, 另外也用到 TEXT 欄位當 unique key 跟 index, 可是明明 VARCHAR 可以解決, 所以我就把欄位型別都改掉了。

下面放上 Simplepie 的 DB schema, 其實我不了解 TEXT 設 UNIQUE 跟 INDEX 還有 (125) 這些東西, 得再來研究研究, 雖然說我都已經改掉了 XD

CREATE TABLE cache_data (
id TEXT CHARACTER SET utf8 NOT NULL, items SMALLINT NOT NULL DEFAULT 0, data BLOB NOT NULL, mtime INT UNSIGNED NOT NULL, UNIQUE ( id(125) ) );

CREATE TABLE items (
feed_id TEXT CHARACTER SET utf8 NOT NULL, id TEXT CHARACTER SET utf8 NOT NULL, data TEXT CHARACTER SET utf8 NOT NULL, posted INT UNSIGNED NOT NULL, INDEX feed_id ( feed_id(125) ) );```

所以換了 db cache 之後… 檢查 cache 的方式又改了一次了 Orz

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!