2012年3月21日 星期三

[PHP] CodeIgniter (PHP Framework) 筆記


圖片來源:http://codeigniter.com/


最近因工作上的關係,重溫 PHP & MySQL 的懷抱。說真的,我上一次寫 PHP & MySQL 已經是 2005 年的事情,但我離 PHP 還沒那麼遠,至少 2009 年還有寫過。最近工作上採用 CodeIgniter Framework,算是第一個我接觸的 PHP Framework 了。我記得在 2009 年時,我還很討厭 framework 這類的東西,但工作幾年後,我發現 framework 在某個角度來說是很有用的,例如工作交接、維護與傳承。


老實說用 framework 開發速度不見得快,但好處之一就是可以讓一群人依循某種共同的開發架構(MVC)撰寫程式,如此一來要接手的人比較不會太痛苦,至少痛苦的機率小了那麼一丁點。這邊就先簡短記錄一些筆記。


效能:


參考 Google Search 的第一筆資料 - PHP Framework 的效能比較。簡單的說,在一些常見的 framework 中,CodeIgniter 效能不算差的,但與原生 PHP 來比,效能還是差了一大截。


架構:


稱得上很標準的 MVC 吧?目錄結構有 application/controllers、application/models 和 application/views ,如其名的架構,其中寫 controller 時,大部分都是用一個  class 的架構,依照該 class 來實作:


class Welcome extends CI_Controller {
        public function index()
        {
                echo "Page at /welcome";
        }
        public function test()
        {
                echo "Page at /welcome/test";
        }
        public function update($x = NULL)
        {
                echo "Page at /welcome/update";
        }


所以,你的網頁上就有 http://domain/index.php/welcome、http://domain/index.php/welcome/test、http://domain/index.php/welcome/update 和 http://domain/index.php/welcome/update/x 四種網址位置(其中最後的 x 是變數)。


接著 Models 的部分,也是繼承某個 class 的寫法:


class MyModel extends CI_Model {
        function get_all_entries()
       {
                $query = $this->db->get('mytable');
                return $query->result();
       }
}


如此一來,在 controller 裡頭就可以用:


class Welcome extends CI_Controller {
        public function index()
        {
                $this->load->model('MyModel');
                $this->MyModel->get_all_entries();
        }
}


而 views 比較像傳統 PHP 用法,不用是個 class 而是像以前寫 PHP 那樣夾雜 HTML、PHP、CSS 和 Javascript 等,而這個 view 能接收的參數需要從 controller 傳進來:


class Welcome extends CI_Controller {
        public function index()
        {
                $x = array('123','456');
                $this->load->view( 'myview' , array( 'data' => $x ) );
        }


接著在 application/views/myview.php 中,就可以透過 global 變數 $data 取得資料。


 缺點:


錯誤訊息不見得會顯示


有道是越難除錯的錯誤,通常是最蠢的問題,對於 CodeIgniter 來說,像 controller 和 models 這種 class 架構來說,不小心漏寫{}時,系統不見得會顯示錯誤,此時只會看到 500 internal server error 這種訊息,這跟直接用 PHP 會顯示錯誤訊息來說,實在很不方便。除此之外,如果使用 MySQL 時,未安裝 php5-mysql 相關套件時,也一樣空白一片。


這些真的還滿糟糕的。


Session 預設為 client side session 架構


對 PHP 來說,原先有 $_SESSION 使用,但在 CodeIgniter 必須改用 $this->session->all_userdata() 這類的存取方式,但真正棘手的是它的實作方式,預設是把 session 資料進行加密儲存在 cookie 裡頭,除了安全問題外,本身 cookie 就跟瀏覽器的實作有關,所以不見得所有資料都可以正常透過 setcookie 方式儲存起來,例如 $session['中文字'] = true 在 2.1.0 版就會發生問題!更別說 cookie 資料被破解、使用限制等等的。


另一個作法是把 session 資訊儲存在 Databases 裡頭,如此也可能導致 DB 連線頻繁而產生效能危機。


更多資訊可以參考:Session 的瓶頸與解決方法,在此就是文中第三種方式。


 以上算是目前粗淺使用的經驗。


沒有留言:

張貼留言