2007年9月23日 星期日

終於解決首頁顯示太慢的問題

七月的時候試著用 moodle 重架學校的首頁,弄到一半,每天有上不完的暑期輔導課,就完全停工。首頁沒弄好,反而把 MySQL 資料庫弄壞,毀了不少文章 & 留言。

開學後,把教學組工作交還給許組長後,首頁改版的動作才重新開工。改一改修一修之後,首頁是大致上有個樣子了。但是一直有個問題我無法克服,就是速度太慢,要過個十幾秒首頁才會出現。

速度會這麼慢的起因是我貪心的想要把行政單位 & 各領域部落格的文章標題抓到首頁來顯示。

我利用 Yahoo! Pipes 將各個部落格 RSS 抓在一起,篩選排序;再利用 FeedBurner 將 Yahoo! Pipes 醜醜的 RSS 轉成比較容易記憶的樣式。最後,利用 FeedBurner 的 BuzzBoost 選項,將 RSS 轉成一般 HTML 放到 moodle 中間區塊,充實首頁的內容。

為什麼要這麼麻煩?moodle 不是就可以直接引用 RSS 了嗎?幹嘛還轉成 HTML 呢?

問題是,moodle 雖然可以直接引用 RSS,但祇能開在左、右邊欄,如果想在中間區塊引用,我不知道要怎麼處理。平常的 blogroll 放在左、右邊欄可能是 ok 的,但學校行政單位的公告、領域訊息也放在邊欄就有點奇怪了。所以祇好將它轉成 HTML 再放到中央來。

壞就壞在一旦引用了這些 blog 的文章標題,整個首頁開啟就慢的讓人受不了。這似乎是 FeedBurner 的處理速度不快,所以整個頁面都停在那邊等 FeedBurner 送資料過來。

我想過,如果將 FeedBurner 送來的資料貯存在本機上,首頁直接引用本機貯存的資料,那應該可以讓顯示速度快的多。而我祇需每個小時去 FeedBurner 更新資料即可,反正晚個一小時將 blog 上的文章放到學校首頁應該還不會有人想砍我才對!!

既然想將 FeedBurner 的資料快取在自己的電腦上,我試著先利用 wget 去抓資料。問題來了,FeedBurner 提供的是一個 javascript code:

<script src="http://feeds.feedburner.com/edu/AdminOffice?format=sigpro" type="text/javascript" ></script>

將這一段 code 寫到 html 檔中,用 wget 抓這個網頁,抓回來的還是這一段 javascript code,而不是最後的執行結果。

既然 wget 沒辦法抓回我要的資料,我想,應該是 javascript 需要在瀏覽器上解析後才能顯示最後結果,所以我利用 lynx 這套 linux 下常用的文字模式瀏覽器去抓這個網頁,希望 lynx 能幫我執行 javascript,讓我存下最後的執行結果。

我又失望了。

lynx 看不到 javascript 的執行結果。再試用其他文字模式瀏覽器:w3c、links 以及砍站軟體 httrack,都祇能抓到 javascript code,但無法呈現執行後的結果。

好吧,那就上網找資料,查查是否有辦法寫一段程式去抓執行後的結果。我本身不會寫程式,所以我祇能借助 google,查詢是否有人已經寫過類似的工具,自己再拿來改一改。

我在 google 找了許久,也在 php 首頁查了許多函式用法,似乎找不到需要的功能。後來看到一個論壇的討論,才知道原來要獲得 javascript 的執行結果可是牽涉廣大,大家也都希望有人寫這樣的程式出來呢!!

那,沒望了嗎?

喔,好巧,無聊之中我直接開啟上面那段 javascript 中的網址 (http://feeds.feedburner.com/edu/AdminOffice?format=sigpro),結果發現它呈現的都是 document.write('<ul>'); 之類的指令。我想,祇要用幾個簡單的 filter 將 document.write(' 及 '); 刪除掉,留下純粹的 HTML code 就是我需要的東西了。

好友帆帆指出,如果用 filter 將不需要的指令刪除,那麼以後 FeedBurner 祇要改一下內容,我就又要跟著修正 filter。

所以他給我另一個建議,與其將 document.write 刪除,倒不如在這些指令的前後加上 <script></script> 讓它成為一段完整的 javascript。這樣 FeedBurner 改變內容時舊的程式也許還能使用。

聽了帆帆的建議,我寫了一小段 php,執行之後果然順利的得到我要的結果,也讓首頁的開啟速度大幅減少。我寫的程式請參考這裡。如果你也有從 FeedBurner 抓資料的需求,不用客氣,直接拿去用就是。

但因為我不會寫程式,所以這一段 php 是我一面參考別人的程式,一面自己修修改改弄出來的,執行效率應該挺差才對,希望有人可以幫忙修改一下。

雖然我的問題暫時解決了,不過我還是很希望有辦法把 javascript 執行後的資料抓下來的工具啊,要不然哪天 FeedBurner 修改一下它的程式,我就沒東西可抓了啊……

Technorati : , , , , ,