PHP操做redis的兩種方式

隨着redis使用愈來愈普遍,各類應用系統幾乎都會嵌入redis。固然,PHP也不例外。在我接觸到的項目中,主要是使用redis做爲緩存服務器。可是對於PHP來講,它自己並不支持redis。因此說這裏咱們須要本身作一些事情,是PHP能夠鏈接redis並操做它。php

這裏主要有兩種方式:一種是經過第三方擴展,另外一種是本身使用socket來封裝redis。linux

經過第三方擴展git

目前,對於php操做redis的第三方擴展有不少,咱們在這就拿phpredis爲例來介紹。github

固然,按照常規的PHP模塊來講,在安裝phpredis擴展以前,若是咱們像其餘的模塊同樣來實例化redis操做對象的話,系統會報找不到redis類的錯誤redis

<?php
$obj = new redis();
var_dump($obj);
 
?>

錯誤以下windows

Fatal_error: class redis not found……

從上面咱們也能夠看出php默認是不支持redis操做的。緩存

那麼咱們接下來就須要本身動手了。服務器

在linux系統下擴展session

首先咱們須要下載,固然在linux上下載第三方應用仍是比較容易的。phpredis的源代碼託管在github上,下載地址:https://github.com/phpredis/phpredis.gitsocket

# git clone https://github.com/phpredis/phpredis.git

而後進入該目錄

#cd phpredis

對PHP擴展第三方應用,須要藉助phpize這個工具,具體步驟以下

# /usr/local/php/bin/phpize  //生成編譯須要的文件
# ./configure

這個過程可能會出現以下錯誤

configure: error: Cannot find php-config. Please use --with-php-config=PATH

出現這個錯誤的時候,咱們須要按照它的提示 使用 –with-php-config=PATH從新操做

#./configure –with-php-config=/usr/local/php/bin/php-config
//成功
# make && make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/   //編譯安裝成功後的結果

最後的結果告訴咱們,phpredis已經編譯成功。在/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/這個目錄下已經生成了redis.so庫。

而後咱們編輯php.ini配置文件,將redis.so類庫加入到php.ini擴展中

extensions_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/
extension=redis.so

而後咱們重啓服務,這時phpredis已經擴展成功了。咱們可使用phpinfo()函數檢測當前PHP的環境信息。

發現當前php已經支持redis操做了。

其實在linux系統下面對PHP進行第三方的擴展很簡單。下面咱們來看一下如何在windows下進行擴展。

在windows系統下擴展

因爲工具所限,不能實際在windows系統下進行擴展。下面是翻譯自https://github.com/phpredis/phpredis/issues/213#issuecomment-11361242 的方法。

1. 安裝visual studio 2008

2. 下載PHP源碼

3. 解壓到C:\php\php5

4. 下載http://windows.php.net/downloads/php-sdk/php-sdk-binary-tools-20110915.zip 而且解壓到C:\php

5. 打開 cmd 依次執行下面的命令

>cd C:\php\php-5.4.9\ext
>git clone https://github.com/nicolasff/phpredis.git
>cd ..
>buildconf.js
>"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv" /x86 /xp /release
>path "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";%PATH%
>bin\phpsdk_setvars.bat
>"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
>configure.js --disable-all --enable-cli --enable-redis --enable-redis-session (if building the nts version, also add --disable-zts)
>nmake php_redis.dll
>fix any compilation errors

最後將生成的php_redis.dll 拷貝到 php安裝目錄\ext 目錄下面。而後編輯php.ini,添加以下內容

extension=php_redis.dll

最後重啓服務便可完成phpredis在windows下的擴展。

使用原生php封裝phpredis

上面咱們介紹了使用第三方的擴展使php支持redis操做。除此以外咱們還能夠本身經過redis的協議使用php來封裝phpredis。

這裏我先封裝一個類,簡單的實現get 命令。代碼以下

<?php
class Redis{
   
    private $handle;
   
    private $host;
    private $port;
    private $slient_fail;
    private $timeout;
   
    private $connect_timeout = 3;
   
    public function __construct($host,$port,$slient_fail = false,$timeout = 60){
        if($host && $port){
            $this->connect($host,$port,$slient_fail,$timeout);
        }
    }
   
    private function connect($host = '127.0.0.1',$port = 6379,$slient_fail = false,$timeout = 60){
        $this->host = $host;
        $this->port = $port;
        $this->slient_fail = $slient_fail;
        $this->timeout = $timeout;
        $this->handle = fsockopen($host,$port,$errno,$errstr,$this->connect_timeout);
    }
   
    public function get(){
        $nl = "\r\n";
        $cmd = '*2'.$nl.'$3'.$nl.'get'.$nl.'$5'.$nl.'mykey'.$nl;
        fwrite($this->handle, $cmd);
        $res = fgetc($this->handle);
        $res = trim(fgets($this->handle));
        $response = fread($this->handle,$res);
        fgets($this->handle);
        echo $response;
    }
}
 
$obj = new Redis('192.168.144.133',6379);
$obj->get();

在上面代碼中,有一個須要注意的地方。就是在成員函數get()中的變量$cmd的內容須要和你們簡單介紹一下。

$cmd = '*2'.$nl.'$3'.$nl.'get'.$nl.'$5'.$nl.'mykey'.$nl;

其中*後面的數字表示該命令的參數個數。由於有兩個參數 get 和 mykey,因此*後面是2。$後面的數字表示的是參數的長度。get長度是3,mykey長度是5。因此前面分別是 $3和$5。

關於redis協議的詳細介紹你們能夠參考http://redis.io/topics/protocol

相關文章
相關標籤/搜索