/ PHP

[php tech.] 類別延伸應用的一些心得

嚴格說起來應該不是什麼技術文件,就當作是我自己在工作上的一些碎碎念跟筆記就好了,不用太嚴肅。技術在進步,人心貪婪的程度也在進步,是不是成正比我不知道,但是確實都在往前進。自從上個禮拜在公司大幅翻修自己的編寫的 Classes 之後,我突然發現,其實有很多地方是存在著些許瑕疵的,只是之前都不太理它而已。說起來,這樣好像不是一個程式設計人員應該做的事情。我不想說我是什麼程式設計師,因為我還不到那個格。

因為工作的關係接觸了很多目前很熱門的 ajax frameworks,當然 不是全部 都接觸過,到頭來我還是回到 xajax 這個套件裡面。扣掉這一個部份,剩下的除了 php 之外還是 php 而已,好像也沒什麼──你說 RoR 嘛,好像有好一陣子沒有去碰它了──長進。我知道這樣是不行的,身為一個接觸網際網路的工作者來說,持續不斷的補充自己的能量才是真的,當然,我也會希望自己在某些方面能做到最好,起碼這樣做起來比較心安理得。

說一件有趣的事情。

前些日子因為不太滿意自己所寫的檔案上傳機制,上網 survey 一下關於 xajax 與無刷新上傳的相關資料,抓了幾個來玩發現其實是大同小異,唯一的缺陷是,你在按下 reload 的時候猛然發現,資料被重送了!歐!這真的是讓我感到很訝異的一件事情。看來原本發展這個工具的人似乎沒有考慮到這一點。回頭看看自己寫的,雖然很多很討人厭的 Javascript code 在裡面,但是,我卻沒有資料重送的問題,我是否該感到欣慰呢?

而其實,我自己也可以將這些東西全部改由 xajax 的方式去達成,只是我自己摸著良心,真的是我自己很懶得弄,安於現況的想法好像比較多。起碼送資料不會有問題,就算是 Javascript code 被人家 Hack 掉──那又不是很難的 DOM──我也不會太過於訝異,後端還有我自己──但是我好像也把他 Open source 出來給各位讀者了──撰寫的 Attachments Classes 再做對映,還可以卡一個關卡。但是,出來跑 總是要改的,畢竟安全性第一。

所以我改了嗎?是啊,我改掉了,但是我不難保哪天又拿出來跟各位分享就是(無責)。

至於資料庫,其實我覺得,不管你是用哪一種 Classes 或是套件 (like ADODB),其實那些東西都不是重點。我工作到現在也不過兩年──我知道很短,所以我還很嫩──多幾個月而已,但是我當過四五次救火隊,而且是在短短兩個工作內,這種經驗還真是 他媽的 難得啊!我不是抱怨,畢竟這樣的事情可以強迫自己去學到很多,你沒有遇到絕對不知道怎麼去應對的事情。這確實是一件好事!當然啦,公司會需要到救火隊,恐怕對公司來說不是什麼好事。

特別是,我之前遇到 CentOS 在跑程式的時候 Average loading 飆上 400 的時候。

聽說還飆到 600 過,我想稍微有摸過伺服器的人,Average loading 1.0 還算是低負載,如果飆到兩位數已經是高負載了,它飆到三位數耶, 你看看這程式寫的多棒啊! 這與資料庫何干呢?後來我去查詢了 slow queries 的 log 記錄檔,發現最大的 slow query 竟然高達 2,108 秒,我真的不知道該怎麼解釋那個 query 到底在做甚麼事情。除了資料庫的設定檔沒有最佳化之外,全站的 query 的效能也是低到個不行,我當下覺得,這一個才 publish 不到一個月的新站,馬上就要面臨全站改寫的命運,會不會太戲劇化了點?

然後我就只能默默的開始改寫。

我只能說,真的,不管你用了什麼樣的工具去操作你的資料庫,其最根本的問題,還是出在你的 query 是不是真的有用心思考過,是不是你對於你所下的每一次的查詢,都能夠符合所謂的效能與結果的最佳化比例。這種比例是我自己的說法,但是總結來說,資料庫不是萬能,它只是 幫你放資料而已,剩下的事情都要你自己來,結構的規劃、建置,資料取得、儲存的方式,每一個細節都會影響到最後的結果。

而且,老實說,我實在非常建議有在使用 MySQL 的人多看看官方的說明文件。舉個例子來說,這兩種 query 是在做同一件事情,你能不能告訴我哪一種效能比較好呢?

SELECT * FROM `users` WHERE `id` = '1' LIMIT 1;</li><li>SELECT `id`,`username`,`password`,`email`,`realname`,`lastloggedin`,`ip`,`created` FROM `users` WHERE `id` = '1' LIMIT 1;

請你自己回答自己,再去 survey 一下官方文件怎麼說。

其實之前聽過許多前輩──這應該是公認的──建議,靜態文件永遠比動態文件要快很多。但是面臨到一個問題就是,如果更新了怎麼辦?重新建立一次快取檔案嗎?是啊,的確是這樣沒錯。只是我不知道,在只有一台主機的狀況下能負荷多少次的這樣 rebuild?老實說,我也不知道(逃)。目前的狀況來說,我是連 MySQL query 出來的結果都把它快取了,其實是偷偷學 ADODB 的做法,雖然我不知道這樣做到底是對是錯,但是,起碼我覺得效果還是有的。

糟糕,我好像在抱怨似的。

現在,我總覺得還是得把許多事情做得更好一點才是,只是說,有時候會卡到陰不知道卡到什麼鬼,結果永遠都不是自己想要的結果,這種時候真的是無語──問蒼天也沒用吧──問蒼天。但是,把該做的事情做到最好,也許是這種龜毛性格唯一的好處吧。