2015/11/10

特定情況下 PHP 可以比 awk 還要快

因為工作上的需要,會需要將 HTTP log 抓出來做統計,所以會遇到類似下方的 RESTful path:
GET /user/123/bio HTTP/1.1 ...
GET /user/456/bio HTTP/1.1 ...

如果取完整的 path 則無法辨別後端到底是使用哪一個 API,所以使用 awk 的 regex 辨識後 mapping 到 API 名稱上。寫完以後的 awk script 大約有 300 行左右,一份 log 大概要花 2 分鐘左右。

後來經高人指點,PHP 的 native library 好歹也是 C++ 寫的,理論上不會太慢,於是用 PHP 的 preg_match() 將相同的邏輯寫了一次。同一份 log 使用 PHP 來 parse 大約只需要 1 分 32秒。

另外 PHP 預設會載入已安裝的 extensions (mysql, mcrypt ...),既然只用到 native library 的話,其實這些也可以去掉不要用。改為「php -n」不載入任何 extension 再執行時,速度又快了一些,只要約 1 分鐘。

PHP 其實還有一些可以繼續調整的東西,像是把資料放在陣列裡面做搜尋時,如果把資料存成 array index 並使用 array_key_exists() 方式去判斷,會比 in_array() 還要更快 [Ref]

2015/11/09

同時追蹤多個 log 檔

通常我們會用「tail -f FILE」來將檔案新增加的內容顯示在螢幕上,不過要同時顯示多個檔案的新資料就有點麻煩了,會需要改成以下寫法:
tail -f FILE_1 -f FILE_2 ....

所以有人寫了個歡樂的工具叫做「multitail」可以一次監視多個檔案,甚至還會自動幫你切割視窗來顯示不同檔案的內容。

要做到同上的功能,只要這樣寫:
multitail FILE_1 FILE_2

若要觀察的檔案太多,多到分割視窗根本看不到東西時,也可以讓 multitail 不要做切割,全部顯示在一起就好:
 multitail --mergeall FILE_1 FILE_2