PHP項目中CodeIgniter使用的建議

PHP是一種在服務器端執行的嵌入HTML文檔的腳本語言,語言的風格有類似於C語言,現在被很多的網站編程人員廣泛的運用。下面爲大家介紹一些PHP項目中CodeIgniter使用的建議,一起來看看!

PHP項目中CodeIgniter使用的建議

  開發工具

開發工具有好多,每個人的習慣也不同。Eclipse一直是我的最愛,那麼怎麼讓Eclipse支持codeigniter呢?

首先這是個PHP項目,所以得讓Eclipse支持PHP。假設你的計算機已經安裝了PHP,那麼最簡單的做法就是在Eclipse的market space中搜索PDT並安裝。具體操作:Help -> Eclipse Marketplace。在輸入框中輸入PDT,點擊find

點擊右下方的install,等待幾分鐘即可。

現在可以在Eclipse中寫PHP了,不過對於codeigniter來說,經常用到的語句類似如下:

$this->load->model ( 'user_model' );$this->input->post ('phone');

每次都要手動輸入這麼長的類似的語句對於追求高效的人來說顯然是不可取的,所以得讓Eclipse支持codeigniter特定的代碼提示,包括Controller和Model。把如下代碼添加到

system/core/ 目錄下的Controller文件中CI_Controller類的構造函數之前,這其實就是進行

變量聲明,Model文件也是同樣操作。

/** * @var CI_Config */ var $config; /** * @var CI_DB_active_record */ var $db; /** * @var CI_Email */ var $email; /** * @var CI_Form_validation */ var $form_validation; /** * @var CI_Input */ var $input; /** * @var CI_Loader */ var $load; /** * @var CI_Router */ var $router; /** * @var CI_Session */ var $session; /** * @var CI_Table */ var $table; /** * @var CI_Unit_test */ var $unit; /** * @var CI_URI */ var $uri; /** * @var CI_Pagination */ var $pagination;

只需輸入$this 即可產生代碼提示,效率提高不少。

  自定義輔助函數和庫

一般一個項目中會有許多相同的邏輯,會使用到相同的代碼。如果每次都去複製粘貼不僅麻煩而且不利於後續修改,想到需要修改一個邏輯就要到每個文件裏修改代碼就覺得可怕(涉及到 設計模式 這一塊了,值得我們學學)。所以你要善於利用那些自定義輔助函數(helpers)和自定義的庫(libraries)。把相同的邏輯封裝成函數或者類,每次遇到相同的邏輯之時只需調用現成的helper或者library即可,修改也只需要在helper或者library中一處修改,不需要到處找代碼。

舉一個我項目中的例子。API需要給APP發送的請求返回json格式數據,那麼在PHP中的一種實現方法就是:

echo json_encode ( $data);//$data 是array類型的數據

但是如果$data中包含中文字符的話,輸出的json數據會把中文變成Unicode編碼,爲了避免客戶端需要再次處理數據,需要加入一個參數,即:

echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array類型的數據

這樣就能輸出原始的中文了。但是問題又來了,每次都要寫這麼長一段代碼實在是麻煩,所以封裝成一個輔助函數。在application/helpers 文件夾中新建一個文件render_。其中代碼如下:

那麼每次調用之時只需先在類中的構造函數載入該輔助函數,如下:

$this->load->helper ( 'render' ); // 載入打印json的自定義輔助函數

就可以在本類的所有成員函數中使用該方法:

echo_json ( $data);

這樣省時省力(加上Eclipse的代碼提示,你只需要輸入echo,這個函數就可以出來了)。以後需要修改成編碼後中文,或者轉換成英文等等(奇怪的需求~)你都可以只修改一行代碼,效率提高不少。

  善用緩存

如果一個APP的活躍用戶不是很多,那麼傳統的LAMP架構就可以應付了。但是隨着用戶的逐漸增多,要想提高併發量,最好還是加一個緩存。在memcached和redis中,我選擇了redis,主要因爲它數據類型更豐富(不僅支持key-value型的數據,同時還提供list,set,zset,hash等數據結構的存儲),能幫你實現一部分邏輯(避免重複造輪子)。與Eclipse配置同理,首先得讓計算機上的PHP能夠和redis通訊(假設你的計算機已經安裝了redis),那麼首選的是phpredis擴展,這裏介紹一下我在Debain服務器上的配置過程,執行的命令如下:

wget #下載擴展tar xvf #解壓目錄cd phpredis-master/ #進入解壓後的目錄phpize./configure --enable-redismake && make install #安裝#但是報錯-bash: phpize: command not found(在使用apt-get install php5安裝php時,默#認是沒有安裝phpize的,我們安裝phpredis時,需要用到phpize,因此,需要先安裝#phpize。我們通過安裝php開發者工具來獲取phpize。執行如下命令即可: apt-get install #php5-dev)ls /usr/lib/php5/20100525/#根據安裝提示的文件,結果: m /etc/php5/apache2/ #打開PHP配置文件# Dynamic Extensions 後面添加extension=,因爲上面命令結果顯示有 restart #重啓Apache服務器

現在PHP就能和redis通訊了,測試如下:

connect('',6379); $redis->auth('你的密碼');//爲了安全,要給redis設置密碼 $redis->set('tom','hanks'); echo ' tom:'.$redis->get('tom'). '

';// tom:hanksecho 'will:'.$redis->get('will'); //will:?>

好了,現在來到配置codeigniter使其能夠使用redis的步驟了。Codeigniter3.0.0本身具有redis支持,但是它實現的功能過於單一,不能夠滿足我的業務需求,所以必須要修改。但是最好不要直接在/system/libraries/Cache/drivers/Cache_ 中修改,因爲以後codeigniter升級採用直接覆蓋system文件夾的形式,會覆蓋掉你的代碼。所以最明智的做法還是自己創建一個庫,具體步驟如下:

1、在application/config/ 中加入配置信息:

2、在application/libraries中建立如下圖的文件結構

代碼如下:

CI = & get_instance (); $this->valid_drivers = array ( 'default' ); }}

Rediscli_ 代碼從/system/libraries/Cache/drivers/Cache_ 直接拷貝過來,唯一的不同是把類名從CI_Cache_redis改爲Rediscli_default,這樣就能按照官方的'使用方法使用我們自己寫的庫。

3、現在可以在Rediscli_中添加或者修改方法,具體操作取決於你自己的應用的需求。比如在我的應用中,需要保持一個一定長度的隊列,所以在Rediscli_default類中添加如下兩個方法:

/** * 彈出鏈表頭元素 * @param unknown $key,鏈表名 */ public function lpop($key) { return $this->_redis->lPop ( $key ); } /** * 插入元素到表尾 * @param unknown $key,鏈表名 * @param unknown $value,待插入值 */ public function rpush($key, $value) { return $this->_redis->rPush ( $key, $value ); }

某個類需要調用該庫時只需在其構造函數中添加如下代碼:

$this->load->driver ( 'rediscli' ); // 加載redis自定義庫$this->rediscli->default->is_supported ();//判斷是否支持redis並打開連接

則該類的每個函數就都可以使用Rediscli_default類中的任一方法,示例如下:

$this->rediscli->default->lpop('delnews');//彈出名爲delnews的鏈表頭元素$this->rediscli->default->rpush('delnews',$nid);//該鏈表加入尾元素$nid

  登陸邏輯的實現

對於我們的APP來說,每個請求都要判斷用戶是否已登陸,對於登陸的合法用戶正常顯示請求,對於未登錄的用戶提示“請先登錄”。一般的web應用採用cookie-session機制,一般的session都是以文件形式保存在服務器上,考慮到文件訪問慢於內存訪問,我們可以配置codeigniter的session保存於redis中。我這裏模仿這種機制:用戶正常login後返回一個特定的id和特定的token(你可以自定義產生算法),服務器以id爲key、token爲value直接保存在redis中。以後的每次訪問APP都必須帶上用appsecret(預定義)加密後的參數id和token,服務器端校驗成功即正常返回數據,否則提示“請先登錄”。

那麼是否每個類都需要寫一遍檢查登陸的代碼呢?當然不能這麼幹,我們可以自定義一個基類,在該基類的構造函數中檢查登陸狀態(還可以在這裏加載常用的輔助函數和庫,比如上面的render_helper 和 rediscli)。然後其他的業務邏輯的類就繼承該基類,並完成其自身邏輯即可。

具體操作就是在 application/core 中新建文件 MY_,該文件對應MY_Controller類(繼承CI_Controller類)。該類只需要一個構造函數完成上述功能即可。

然後其它邏輯類只需繼承MY_Controller類就不必再次校驗登陸狀態,而只需完成自身邏輯。

  總結

Codeigniter是我最喜歡的一個PHP框架(相比於thinkPHP,Zend Framework等等),主要在於其易安裝,輕量,易自定製的優點。把握好這些優點,我們就能寫出不遜於那些重量級框架寫出來的應用,並且省時省力。