成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP項(xiàng)目中CodeIgniter使用的一些建議

Barrior / 2606人閱讀

摘要:把如下代碼添加到目錄下的文件中類(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

相關(guān)文章

  • CodeIgniter 4 建議路線圖

    摘要:核心變化從第一版發(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ì)有...

    sean 評(píng)論0 收藏0
  • 騰訊云Codeigniter小記

    摘要:前段時(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...

    Ocean 評(píng)論0 收藏0
  • 騰訊云Codeigniter小記

    摘要:前段時(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...

    alphahans 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<