国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP項目中CodeIgniter使用的一些建議

Barrior / 2575人閱讀

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

最近再給一個APP寫API,同時還要寫相應的后臺管理網站。為了便于開發和代碼組織與管理,我決定采用一個現有的框架。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_helper.php。其中代碼如下:


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

$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 https://github.com/nicolasff/phpredis/archive/master.tar.gz  #下載擴展

tar xvf master.tar.gz      #解壓目錄

cd phpredis-master/     #進入解壓后的目錄

phpize

./configure --enable-redis

make && 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/#根據安裝提示的文件,結果:curl.so  gd.so  redis.so

vim /etc/php5/apache2/php.ini   #打開PHP配置文件

# Dynamic Extensions 后面添加extension=redis.so,因為上面命令結果顯示有redis.so

/etc/init.d/apache2 restart       #重啟Apache服務器

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

connect("127.0.0.1",6379);

 $redis->auth("你的密碼");//為了安全,要給redis設置密碼

 $redis->set("tom","hanks");

 echo " tom:".$redis->get("tom"). "
";// tom:hanks echo "will:".$redis->get("will"); //will: ?>

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

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


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

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、現在可以在Rediscli_default.php中添加或者修改方法,具體操作取決于你自己的應用的需求。比如在我的應用中,需要保持一個一定長度的隊列,所以在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_Controller.php,該文件對應MY_Controller類(繼承CI_Controller類)。該類只需要一個構造函數完成上述功能即可。

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

總結

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21382.html

相關文章

  • CodeIgniter 4 建議路線圖

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

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

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

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

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

    alphahans 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<