D-Link 友訊科技工程師。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。
相關資源:投影片 | 照片
對於大型網站的實作,他非常反對建立單一層的 Front Controller。 不同類型的 Request 應該導到不同的 Server 群組來做處理。 以 Yahoo! 電子郵件這個服務來說,全部走 AJAX Request, 像是讀取郵件及列表、撰寫及發送電子郵件、以及存取通訊錄等不同的 Request。 裡面我們知道讀取郵件列表是操作最頻繁的,所以應直接由最多的 Server 群組來處理。 大部分的 Framework 都會在應用程式的層級建立一個 Front Controller,這樣的效果對 Performance 是很不好的。
也因此他主張讓 PHP 非常簡單就可以使用,不往 Framework 的方向來發展。 對於 Scalability,只要有對的 Architecture 及適當定義的 API,就會有非常好的效能。
在這個部分,Rasmus 展示了很多的效能檢測的工具。 給我很大的啟示是永遠用 Benchmarking 的數字來證明你的問題所在,而不要空口說白話。 以下的工具大家一定要用啊:
開發者可以使用 Siege 來偵測一個網站的 Response Time 與 Transaction Rate。
Rasmus 的測試範例是一個叫 Laconica 的網站,其實就是 Open Source 版的 Twitter。
Laconica 用了很複雜的方式來產生 header 的部份,但在 99% 的情況下都只會產生一種。
另外它還採用了 DBObject 這種方便使用的 Class,以上兩個作法讓程式的效能變得很差:
Response time 為 0.27 秒、Transaction rate 為每秒 18.71 個。但把上面兩個問題解決後,
加上 APC Cache 與 include path 的微調,Response Time 變為 0.11 秒、Transaction rate 為每秒 46.63 個。
http://talks.php.net/show/ntu/10/
inclued 是一個 PHP 的 extension,讓開發者可以檢查檔案間的 require 的關係、還有物件的繼承關係。
應盡可能減少 require_once、改為 require 的方式,可以節省很多的效能。
http://talks.php.net/show/ntu/16
Rasmus 說他無法理解一個 Programmer 竟然沒有使用 Callgrind 這樣的工具來做 Profiling。
他在開發時,一天要使用至少 30 次來檢查程式的 Bottleneck 為何。
那麼 Callgrind 究竟為何呢?它可以產出一份報表,顯示出你的 PHP 在每一個程序裡面耗費了多少 CPU 資源。
http://talks.php.net/show/ntu/25
另外就是有許多被人忽略的小地方,像是未設定 TimeZone 或者是不去處理 error log 像是 notice 或 warning 的部份都會影響 Performance。也有提到另一套 Profiling 的工具叫 XDebug。 有人說 PHP 很慢,但當你用了 Profiling 方式來證明時,數字會說話。 遠比像是 RoR 這些寫起來很漂亮的框架來得快上許多。
對於現有的 PHP Framework 他也用以上的效能檢測工具全部測試了一遍(請參考 http://talks.php.net/show/froscon08/24)。 以最簡單的 echo 'hello world' 的 Transaction Rate 為例 (每秒600個), 有名的 Framework 像是 CakePHP 居然慢了 15 倍(每秒約40個)。 另外像是 Symfony 或 Zend 同樣好不到哪裡去。 對於這些 Framework,Rasmus 說他不會反對大家用,但是他希望我們知道這些 Framework 都是解決一些特定的問題, 不是所有的問題都可以由一個 Framework 解決。如果你要用 Symfony,你必須完整地了解他、 找出它對你應用程式的 Bottoleneck、並且修改它成你所希望的,這樣才是對的作法。絕對不要照著說明書上的 Suggestion 就依樣畫葫蘆,這不是建立一個好系統的作法。
這個部分 Rasmus 直接以一個有 XSS 漏洞的線上網站為範例,講解了一系列結合 JavaScript 的 XSS 攻擊模式。
http://talks.php.net/show/ntu/27
像是之前 Firefox 2.0.0.5 的 bug 在 mailto: 的 URL Handler 的部份沒有處理好。 讓 Hacker 可在惡意網站裡埋入執行碼 (cmd.exe) 對使用者的電腦造成危害。 同樣的問題仍有可能出現在使用者安裝的 Extension 中,像是 Skype 會自動將電話格式轉為連結, 但這樣的連結是否會對使用者造成危害?只能祈禱開發軟體的人不會有任何疏漏。
另外 Rasmus 提了許多 XSS 的類型(像是 HTML 屬性沒有雙引號、GET、POST、Cookie、PHP_SELF/REQUEST_URI、Header、img 的 src 可執行 JavaScript 等), 一個重點就是不要將沒有 filter 過的使用者輸入字串顯示在頁面上。 PHP 有提供一個 filter 的 extension, 可以讓你比較快速地做使用者資料的檢驗。
但即使如此,你還是要非常小心,因為即使字串經過 filter,還是可能有問題。 像是我們常用在標籤裡的 onClick 之類的事件處理、innerHTML、或者是 style 等, 都會以 eval 的方式直接對特殊編碼做轉換,提供給 XSS 另外一種可入侵的 pattern。
在演講中,Rasmus 也提到了 sla.ckers 這個 Security 網站, 上面會有人分享新發現的漏洞,Yahoo! 內部也定期有人會去觀看,確定這些漏洞不會對 Yahoo! 造成危害。