MagpIERSS是一個不錯的RSS抓取/解析工具,我本來打算自己寫一個PHP的RSS解析工具,不過試了一下MagpIERSS,覺得還不錯,能滿足需要。
順便看了看代碼,記點筆記。
1.亂碼問題
MagpIERSS過去時常出現亂碼問題,從0.7版本解決了這個問題
Version0.7
support for input and output charset encoding
based on the work in FoF,uses iconv or mbstring if available
0.7之後的版本可以指定輸入和輸出字符編碼,然後使用iconv或mbstring函數進行編碼轉換。這個工作在create_parser函數裡面完成的,如果兩個函數都不存在,可以在RSS_fetch.inc中讓MAGPIE_DETECT_ENCODING為false,不檢測和轉換編碼,否則就會出錯。
一切正常的情況下,把RSS_fetch.inc中MAGPIE_OUTPUT_ENCODING定義成你需要的輸出編碼,比如UTF-8:define(‘MAGPIE_OUTPUT_ENCODING’,‘UTF-8’);就可以獲得正確的輸出結果了。
2.抓取方法
MagpIERSS用了Snoopy作為http客戶端來抓取RSS。這個庫比較完善,支持https,支持gzip。
需要注意的是,Snoopy用exec命令調用curl,然後返回結果,而不是使用編譯進PHP的curl函數。默認的路徑是“/usr/bin/curl”,如果這裡沒有curl或是沒有執行權限,就可能失敗。不過只有https需要用到curl,普通的http訪問是用fsockopen的。
同時,Snoopy可以使用代理服務器,但是MagpieRSS沒有使用,如果需要可以在RSS_fetch.inc中的_fetch_remote_file函數裡面添加$client->proxy_host和$clIEnt->proxy_port。
3.緩存
MagpieRSS設置了一個默認3600秒超時的緩存。在./cache下放了一堆文件,文件名是md5之後的url+MAGPIE_OUTPUT_ENCODING,格式是PHP的serialize。
所以cache目錄要可寫。超時時間在RSS_cache.inc的var$MAX_AGE=3600;這行設置,也可以在創建cache對象的時候設置。
綜合起來,這個庫還是不錯的,優點很多,也考慮了主機的各種情況,兼容性很好。函數形式的接口,很容易調用。不過應該先用head來取RSS的http header,根據Etag來判斷是否抓整個頁面回來,這樣效率還能再有提高。這個改動之後,cache就可以存在更長的時間,而不是一個固定的3600秒。同時我比較想把文章保存起來,以便以後用,這就需要數據庫了。
我將來應該會基於這個東西發布一個新版本,把我想要的功能加進來。