摘要:把如下代碼添加到目錄下的文件中類(lèi)的構(gòu)造函數(shù)之前,這其實(shí)就是進(jìn)行變量聲明,文件也是同樣操作。舉一個(gè)我項(xiàng)目中的例子。該類(lèi)只需要一個(gè)構(gòu)造函數(shù)完成上述功能即可。
最近再給一個(gè)APP寫(xiě)API,同時(shí)還要寫(xiě)相應(yīng)的后臺(tái)管理網(wǎng)站。為了便于開(kāi)發(fā)和代碼組織與管理,我決定采用一個(gè)現(xiàn)有的框架。Codeigniter由于其輕量容易自定制的特點(diǎn)吸引了我,一路開(kāi)發(fā)過(guò)來(lái)也有大半年時(shí)間了,寫(xiě)下一些自己在開(kāi)發(fā)過(guò)程中的一些體會(huì)來(lái)與大家共勉。
開(kāi)發(fā)工具開(kāi)發(fā)工具有好多,每個(gè)人的習(xí)慣也不同。Eclipse一直是我的最?lèi)?ài),那么怎么讓Eclipse支持codeigniter呢?
首先這是個(gè)PHP項(xiàng)目,所以得讓Eclipse支持PHP。假設(shè)你的計(jì)算機(jī)已經(jīng)安裝了PHP,那么最簡(jiǎn)單的做法就是在Eclipse的market space中搜索PDT并安裝。具體操作:Help -> Eclipse Marketplace。在輸入框中輸入PDT,點(diǎn)擊find,如圖:
點(diǎn)擊右下方的install,等待幾分鐘即可。
現(xiàn)在可以在Eclipse中寫(xiě)PHP了,不過(guò)對(duì)于codeigniter來(lái)說(shuō),經(jīng)常用到的語(yǔ)句類(lèi)似如下:
$this->load->model ( "user_model" ); $this->input->post ("phone");
每次都要手動(dòng)輸入這么長(zhǎng)的類(lèi)似的語(yǔ)句對(duì)于追求高效的人來(lái)說(shuō)顯然是不可取的,所以得讓Eclipse支持codeigniter特定的代碼提示,包括Controller和Model。把如下代碼添加到
system/core/ 目錄下的Controller文件中CI_Controller類(lèi)的構(gòu)造函數(shù)之前,這其實(shí)就是進(jìn)行
變量聲明,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;
現(xiàn)在效果如下:
只需輸入$this 即可產(chǎn)生代碼提示,效率提高不少。
自定義輔助函數(shù)和庫(kù)一般一個(gè)項(xiàng)目中會(huì)有許多相同的邏輯,會(huì)使用到相同的代碼。如果每次都去復(fù)制粘貼不僅麻煩而且不利于后續(xù)修改,想到需要修改一個(gè)邏輯就要到每個(gè)文件里修改代碼就覺(jué)得可怕(涉及到設(shè)計(jì)模式這一塊了,值得我們學(xué)學(xué))。所以你要善于利用那些自定義輔助函數(shù)(helpers)和自定義的庫(kù)(libraries)。把相同的邏輯封裝成函數(shù)或者類(lèi),每次遇到相同的邏輯之時(shí)只需調(diào)用現(xiàn)成的helper或者library即可,修改也只需要在helper或者library中一處修改,不需要到處找代碼。
舉一個(gè)我項(xiàng)目中的例子。API需要給APP發(fā)送的請(qǐng)求返回json格式數(shù)據(jù),那么在PHP中的一種實(shí)現(xiàn)方法就是:
echo json_encode ( $data);//$data 是array類(lèi)型的數(shù)據(jù)
但是如果$data中包含中文字符的話,輸出的json數(shù)據(jù)會(huì)把中文變成Unicode編碼,為了避免客戶端需要再次處理數(shù)據(jù),需要加入一個(gè)參數(shù),即:
echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array類(lèi)型的數(shù)據(jù)
這樣就能輸出原始的中文了。但是問(wèn)題又來(lái)了,每次都要寫(xiě)這么長(zhǎng)一段代碼實(shí)在是麻煩,所以封裝成一個(gè)輔助函數(shù)。在application/helpers 文件夾中新建一個(gè)文件render_helper.php。其中代碼如下:
那么每次調(diào)用之時(shí)只需先在類(lèi)中的構(gòu)造函數(shù)載入該輔助函數(shù),如下:
$this->load->helper ( "render" ); // 載入打印json的自定義輔助函數(shù)就可以在本類(lèi)的所有成員函數(shù)中使用該方法:
echo_json ( $data);這樣省時(shí)省力(加上Eclipse的代碼提示,你只需要輸入echo,這個(gè)函數(shù)就可以出來(lái)了)。以后需要修改成編碼后中文,或者轉(zhuǎn)換成英文等等(奇怪的需求~)你都可以只修改一行代碼,效率提高不少。
善用緩存如果一個(gè)APP的活躍用戶不是很多,那么傳統(tǒng)的LAMP架構(gòu)就可以應(yīng)付了。但是隨著用戶的逐漸增多,要想提高并發(fā)量,最好還是加一個(gè)緩存。在memcached和redis中,我選擇了redis,主要因?yàn)樗鼣?shù)據(jù)類(lèi)型更豐富(不僅支持key-value型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)),能幫你實(shí)現(xiàn)一部分邏輯(避免重復(fù)造輪子)。與Eclipse配置同理,首先得讓計(jì)算機(jī)上的PHP能夠和redis通訊(假設(shè)你的計(jì)算機(jī)已經(jīng)安裝了redis),那么首選的是phpredis擴(kuò)展,這里介紹一下我在Debain服務(wù)器上的配置過(guò)程,執(zhí)行的命令如下:
wget https://github.com/nicolasff/phpredis/archive/master.tar.gz #下載擴(kuò)展 tar xvf master.tar.gz #解壓目錄 cd phpredis-master/ #進(jìn)入解壓后的目錄 phpize ./configure --enable-redis make && make install #安裝 #但是報(bào)錯(cuò)-bash: phpize: command not found(在使用apt-get install php5安裝php時(shí),默認(rèn)是沒(méi)有安裝phpize的,我們安裝phpredis時(shí),需要用到phpize,因此,需要先安裝#phpize。我們通過(guò)安裝php開(kāi)發(fā)者工具來(lái)獲取phpize。執(zhí)行如下命令即可: apt-get install php5-dev) ls /usr/lib/php5/20100525/#根據(jù)安裝提示的文件,結(jié)果:curl.so gd.so redis.so vim /etc/php5/apache2/php.ini #打開(kāi)PHP配置文件 # Dynamic Extensions 后面添加extension=redis.so,因?yàn)樯厦婷罱Y(jié)果顯示有redis.so /etc/init.d/apache2 restart #重啟Apache服務(wù)器現(xiàn)在PHP就能和redis通訊了,測(cè)試如下:
connect("127.0.0.1",6379); $redis->auth("你的密碼");//為了安全,要給redis設(shè)置密碼 $redis->set("tom","hanks"); echo " tom:".$redis->get("tom"). "";// tom:hanks echo "will:".$redis->get("will"); //will: ?>好了,現(xiàn)在來(lái)到配置codeigniter使其能夠使用redis的步驟了。Codeigniter3.0.0本身具有redis支持,但是它實(shí)現(xiàn)的功能過(guò)于單一,不能夠滿足我的業(yè)務(wù)需求,所以必須要修改。但是最好不要直接在/system/libraries/Cache/drivers/Cache_redis.php 中修改,因?yàn)橐院骳odeigniter升級(jí)采用直接覆蓋system文件夾的形式,會(huì)覆蓋掉你的代碼。所以最明智的做法還是自己創(chuàng)建一個(gè)庫(kù),具體步驟如下:
1、在application/config/redis.php 中加入配置信息:
2、在application/libraries中建立如下圖的文件結(jié)構(gòu)
Rediscli.php 代碼如下:
CI = & get_instance (); $this->valid_drivers = array ( "default" ); } }Rediscli_default.php 代碼從/system/libraries/Cache/drivers/Cache_redis.php 直接拷貝過(guò)來(lái),唯一的不同是把類(lèi)名從CI_Cache_redis改為Rediscli_default,這樣就能按照官方的使用方法使用我們自己寫(xiě)的庫(kù)。
3、現(xiàn)在可以在Rediscli_default.php中添加或者修改方法,具體操作取決于你自己的應(yīng)用的需求。比如在我的應(yīng)用中,需要保持一個(gè)一定長(zhǎng)度的隊(duì)列,所以在Rediscli_default類(lèi)中添加如下兩個(gè)方法:
/** 彈出鏈表頭元素 @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 ); }某個(gè)類(lèi)需要調(diào)用該庫(kù)時(shí)只需在其構(gòu)造函數(shù)中添加如下代碼:
$this->load->driver ( "rediscli" ); // 加載redis自定義庫(kù) $this->rediscli->default->is_supported ();//判斷是否支持redis并打開(kāi)連接則該類(lèi)的每個(gè)函數(shù)就都可以使用Rediscli_default類(lèi)中的任一方法,示例如下:
$this->rediscli->default->lpop("delnews");//彈出名為delnews的鏈表頭元素 $this->rediscli->default->rpush("delnews",$nid);//該鏈表加入尾元素$nid登陸邏輯的實(shí)現(xiàn)對(duì)于我們的APP來(lái)說(shuō),每個(gè)請(qǐng)求都要判斷用戶是否已登陸,對(duì)于登陸的合法用戶正常顯示請(qǐng)求,對(duì)于未登錄的用戶提示“請(qǐng)先登錄”。一般的web應(yīng)用采用cookie-session機(jī)制,一般的session都是以文件形式保存在服務(wù)器上,考慮到文件訪問(wèn)慢于內(nèi)存訪問(wèn),我們可以配置codeigniter的session保存于redis中。我這里模仿這種機(jī)制:用戶正常login后返回一個(gè)特定的id和特定的token(你可以自定義產(chǎn)生算法),服務(wù)器以id為key、token為value直接保存在redis中。以后的每次訪問(wèn)APP都必須帶上用appsecret(預(yù)定義)加密后的參數(shù)id和token,服務(wù)器端校驗(yàn)成功即正常返回?cái)?shù)據(jù),否則提示“請(qǐng)先登錄”。
那么是否每個(gè)類(lèi)都需要寫(xiě)一遍檢查登陸的代碼呢?當(dāng)然不能這么干,我們可以自定義一個(gè)基類(lèi),在該基類(lèi)的構(gòu)造函數(shù)中檢查登陸狀態(tài)(還可以在這里加載常用的輔助函數(shù)和庫(kù),比如上面的render_helper 和 rediscli)。然后其他的業(yè)務(wù)邏輯的類(lèi)就繼承該基類(lèi),并完成其自身邏輯即可。
具體操作就是在 application/core 中新建文件 MY_Controller.php,該文件對(duì)應(yīng)MY_Controller類(lèi)(繼承CI_Controller類(lèi))。該類(lèi)只需要一個(gè)構(gòu)造函數(shù)完成上述功能即可。
然后其它邏輯類(lèi)只需繼承MY_Controller類(lèi)就不必再次校驗(yàn)登陸狀態(tài),而只需完成自身邏輯。
總結(jié)Codeigniter是我最喜歡的一個(gè)PHP框架(相比于thinkPHP,Zend Framework等等),主要在于其易安裝,輕量,易自定制的優(yōu)點(diǎn)。把握好這些優(yōu)點(diǎn),我們就能寫(xiě)出不遜于那些重量級(jí)框架寫(xiě)出來(lái)的應(yīng)用,并且省時(shí)省力。
作為一個(gè)學(xué)生,在摸索學(xué)習(xí)的路上還有很多問(wèn)題需要解決,本文的目的在于和大家分享,更重要的是大家有什么建議或者批評(píng)請(qǐng)一定不吝賜教哈,我的微博:邱康singasong。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21382.html
摘要:核心變化從第一版發(fā)布以來(lái),社區(qū)發(fā)生了巨大變化。這意味著系統(tǒng)必須全部重寫(xiě)。暫時(shí)不會(huì)為一個(gè)即將停止支持的版本發(fā)布新版本。路由路由功能將被更新。改進(jìn)的日志系統(tǒng)日志系統(tǒng)將被改進(jìn),但具體細(xì)節(jié)尚未確定。第一階段第一階段將側(cè)重于抓住框架最重要的部分。 我們綜合考慮了社區(qū)的愿望和意見(jiàn)后,也對(duì)什么樣的未來(lái)對(duì) CI 是最合適的做了一些思考,然后,CI 理事會(huì)對(duì)框架的未來(lái)做出了一些決策。預(yù)告一下,未來(lái)將會(huì)有...
摘要:前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請(qǐng)了騰訊云學(xué)生機(jī),用的框架弄了一段時(shí)間。這個(gè)用戶既是不可登錄的操作系統(tǒng)用戶,也是數(shù)據(jù)庫(kù)用戶。設(shè)置數(shù)據(jù)庫(kù)用戶密碼為了能夠讓和數(shù)據(jù)庫(kù)相連接,需要設(shè)置數(shù)據(jù)庫(kù)用戶密碼。 打讀研之后,更加關(guān)注算法的學(xué)習(xí),Web開(kāi)發(fā)這一塊便落下了,平時(shí)也通過(guò)微信公眾號(hào)關(guān)注了些,常常感慨,技術(shù)的更迭真是日新月異。 前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請(qǐng)了騰訊云學(xué)生機(jī),用Python的Sc...
摘要:前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請(qǐng)了騰訊云學(xué)生機(jī),用的框架弄了一段時(shí)間。這個(gè)用戶既是不可登錄的操作系統(tǒng)用戶,也是數(shù)據(jù)庫(kù)用戶。設(shè)置數(shù)據(jù)庫(kù)用戶密碼為了能夠讓和數(shù)據(jù)庫(kù)相連接,需要設(shè)置數(shù)據(jù)庫(kù)用戶密碼。 打讀研之后,更加關(guān)注算法的學(xué)習(xí),Web開(kāi)發(fā)這一塊便落下了,平時(shí)也通過(guò)微信公眾號(hào)關(guān)注了些,常常感慨,技術(shù)的更迭真是日新月異。 前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請(qǐng)了騰訊云學(xué)生機(jī),用Python的Sc...
閱讀 3306·2021-09-22 16:06
閱讀 3297·2021-09-02 15:40
閱讀 662·2019-08-30 15:54
閱讀 1065·2019-08-26 12:22
閱讀 1420·2019-08-26 12:17
閱讀 2774·2019-08-26 12:09
閱讀 540·2019-08-26 10:20
閱讀 814·2019-08-23 16:28