成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Barrior / 2640人閱讀

摘要:把如下代碼添加到目錄下的文件中類的構(gòu)造函數(shù)之前,這其實(shí)就是進(jìn)行變量聲明,文件也是同樣操作。舉一個(gè)我項(xiàng)目中的例子。該類只需要一個(gè)構(gòu)造函數(shù)完成上述功能即可。

最近再給一個(gè)APP寫API,同時(shí)還要寫相應(yīng)的后臺管理網(wǎng)站。為了便于開發(fā)和代碼組織與管理,我決定采用一個(gè)現(xiàn)有的框架。Codeigniter由于其輕量容易自定制的特點(diǎn)吸引了我,一路開發(fā)過來也有大半年時(shí)間了,寫下一些自己在開發(fā)過程中的一些體會來與大家共勉。

開發(fā)工具

開發(fā)工具有好多,每個(gè)人的習(xí)慣也不同。Eclipse一直是我的最愛,那么怎么讓Eclipse支持codeigniter呢?

首先這是個(gè)PHP項(xiàng)目,所以得讓Eclipse支持PHP。假設(shè)你的計(jì)算機(jī)已經(jīng)安裝了PHP,那么最簡單的做法就是在Eclipse的market space中搜索PDT并安裝。具體操作:Help -> Eclipse Marketplace。在輸入框中輸入PDT,點(diǎn)擊find,如圖:

點(diǎn)擊右下方的install,等待幾分鐘即可。

現(xiàn)在可以在Eclipse中寫PHP了,不過對于codeigniter來說,經(jīng)常用到的語句類似如下:

$this->load->model ( "user_model" );

$this->input->post ("phone");

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

system/core/ 目錄下的Controller文件中CI_Controller類的構(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ù)和庫

一般一個(gè)項(xiàng)目中會有許多相同的邏輯,會使用到相同的代碼。如果每次都去復(fù)制粘貼不僅麻煩而且不利于后續(xù)修改,想到需要修改一個(gè)邏輯就要到每個(gè)文件里修改代碼就覺得可怕(涉及到設(shè)計(jì)模式這一塊了,值得我們學(xué)學(xué))。所以你要善于利用那些自定義輔助函數(shù)(helpers)和自定義的庫(libraries)。把相同的邏輯封裝成函數(shù)或者類,每次遇到相同的邏輯之時(shí)只需調(diào)用現(xiàn)成的helper或者library即可,修改也只需要在helper或者library中一處修改,不需要到處找代碼。

舉一個(gè)我項(xiàng)目中的例子。API需要給APP發(fā)送的請求返回json格式數(shù)據(jù),那么在PHP中的一種實(shí)現(xiàn)方法就是:

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

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

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

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


那么每次調(diào)用之時(shí)只需先在類中的構(gòu)造函數(shù)載入該輔助函數(shù),如下:

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

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

echo_json ( $data);

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

善用緩存

如果一個(gè)APP的活躍用戶不是很多,那么傳統(tǒng)的LAMP架構(gòu)就可以應(yīng)付了。但是隨著用戶的逐漸增多,要想提高并發(fā)量,最好還是加一個(gè)緩存。在memcached和redis中,我選擇了redis,主要因?yàn)樗鼣?shù)據(jù)類型更豐富(不僅支持key-value型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲),能幫你實(shí)現(xiàn)一部分邏輯(避免重復(fù)造輪子)。與Eclipse配置同理,首先得讓計(jì)算機(jī)上的PHP能夠和redis通訊(假設(shè)你的計(jì)算機(jī)已經(jīng)安裝了redis),那么首選的是phpredis擴(kuò)展,這里介紹一下我在Debain服務(wù)器上的配置過程,執(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)是沒有安裝phpize的,我們安裝phpredis時(shí),需要用到phpize,因此,需要先安裝#phpize。我們通過安裝php開發(fā)者工具來獲取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   #打開PHP配置文件

# Dynamic Extensions 后面添加extension=redis.so,因?yàn)樯厦婷罱Y(jié)果顯示有redis.so

/etc/init.d/apache2 restart       #重啟Apache服務(wù)器

現(xiàn)在PHP就能和redis通訊了,測試如下:

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)在來到配置codeigniter使其能夠使用redis的步驟了。Codeigniter3.0.0本身具有redis支持,但是它實(shí)現(xiàn)的功能過于單一,不能夠滿足我的業(yè)務(wù)需求,所以必須要修改。但是最好不要直接在/system/libraries/Cache/drivers/Cache_redis.php 中修改,因?yàn)橐院骳odeigniter升級采用直接覆蓋system文件夾的形式,會覆蓋掉你的代碼。所以最明智的做法還是自己創(chuàng)建一個(gè)庫,具體步驟如下:

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 直接拷貝過來,唯一的不同是把類名從CI_Cache_redis改為Rediscli_default,這樣就能按照官方的使用方法使用我們自己寫的庫。

3、現(xiàn)在可以在Rediscli_default.php中添加或者修改方法,具體操作取決于你自己的應(yīng)用的需求。比如在我的應(yīng)用中,需要保持一個(gè)一定長度的隊(duì)列,所以在Rediscli_default類中添加如下兩個(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è)類需要調(diào)用該庫時(shí)只需在其構(gòu)造函數(shù)中添加如下代碼:

$this->load->driver ( "rediscli" ); // 加載redis自定義庫

$this->rediscli->default->is_supported ();//判斷是否支持redis并打開連接

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

$this->rediscli->default->lpop("delnews");//彈出名為delnews的鏈表頭元素

$this->rediscli->default->rpush("delnews",$nid);//該鏈表加入尾元素$nid
登陸邏輯的實(shí)現(xiàn)

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

那么是否每個(gè)類都需要寫一遍檢查登陸的代碼呢?當(dāng)然不能這么干,我們可以自定義一個(gè)基類,在該基類的構(gòu)造函數(shù)中檢查登陸狀態(tài)(還可以在這里加載常用的輔助函數(shù)和庫,比如上面的render_helper 和 rediscli)。然后其他的業(yè)務(wù)邏輯的類就繼承該基類,并完成其自身邏輯即可。

具體操作就是在 application/core 中新建文件 MY_Controller.php,該文件對應(yīng)MY_Controller類(繼承CI_Controller類)。該類只需要一個(gè)構(gòu)造函數(shù)完成上述功能即可。

然后其它邏輯類只需繼承MY_Controller類就不必再次校驗(yàn)登陸狀態(tài),而只需完成自身邏輯。

總結(jié)

Codeigniter是我最喜歡的一個(gè)PHP框架(相比于thinkPHP,Zend Framework等等),主要在于其易安裝,輕量,易自定制的優(yōu)點(diǎn)。把握好這些優(yōu)點(diǎn),我們就能寫出不遜于那些重量級框架寫出來的應(yīng)用,并且省時(shí)省力。

作為一個(gè)學(xué)生,在摸索學(xué)習(xí)的路上還有很多問題需要解決,本文的目的在于和大家分享,更重要的是大家有什么建議或者批評請一定不吝賜教哈,我的微博:邱康singasong。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/21382.html

相關(guān)文章

  • CodeIgniter 4 建議路線圖

    摘要:核心變化從第一版發(fā)布以來,社區(qū)發(fā)生了巨大變化。這意味著系統(tǒng)必須全部重寫。暫時(shí)不會為一個(gè)即將停止支持的版本發(fā)布新版本。路由路由功能將被更新。改進(jìn)的日志系統(tǒng)日志系統(tǒng)將被改進(jìn),但具體細(xì)節(jié)尚未確定。第一階段第一階段將側(cè)重于抓住框架最重要的部分。 我們綜合考慮了社區(qū)的愿望和意見后,也對什么樣的未來對 CI 是最合適的做了一些思考,然后,CI 理事會對框架的未來做出了一些決策。預(yù)告一下,未來將會有...

    sean 評論0 收藏0
  • 騰訊云Codeigniter小記

    摘要:前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請了騰訊云學(xué)生機(jī),用的框架弄了一段時(shí)間。這個(gè)用戶既是不可登錄的操作系統(tǒng)用戶,也是數(shù)據(jù)庫用戶。設(shè)置數(shù)據(jù)庫用戶密碼為了能夠讓和數(shù)據(jù)庫相連接,需要設(shè)置數(shù)據(jù)庫用戶密碼。 打讀研之后,更加關(guān)注算法的學(xué)習(xí),Web開發(fā)這一塊便落下了,平時(shí)也通過微信公眾號關(guān)注了些,常常感慨,技術(shù)的更迭真是日新月異。 前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請了騰訊云學(xué)生機(jī),用Python的Sc...

    Ocean 評論0 收藏0
  • 騰訊云Codeigniter小記

    摘要:前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請了騰訊云學(xué)生機(jī),用的框架弄了一段時(shí)間。這個(gè)用戶既是不可登錄的操作系統(tǒng)用戶,也是數(shù)據(jù)庫用戶。設(shè)置數(shù)據(jù)庫用戶密碼為了能夠讓和數(shù)據(jù)庫相連接,需要設(shè)置數(shù)據(jù)庫用戶密碼。 打讀研之后,更加關(guān)注算法的學(xué)習(xí),Web開發(fā)這一塊便落下了,平時(shí)也通過微信公眾號關(guān)注了些,常常感慨,技術(shù)的更迭真是日新月異。 前段時(shí)間為了抓取網(wǎng)絡(luò)文本數(shù)據(jù),申請了騰訊云學(xué)生機(jī),用Python的Sc...

    alphahans 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<