PHP操作redis的两种方式
随着redis使用越来越广泛,各种应用系统几乎都会嵌入redis。当然,PHP也不例外。在我接触到的项目中,主要是使用redis作为缓存服务器。但是对于PHP来说,它本身并不支持redis。所以说这里我们需要自己做一些事情,是PHP可以连接redis并操作它。
这里主要有两种方式:一种是通过第三方扩展,另一种是自己使用socket来封装redis。
通过第三方扩展
目前,对于php操作redis的第三方扩展有很多,我们在这就拿phpredis为例来介绍。
当然,按照常规的PHP模块来说,在安装phpredis扩展之前,如果我们像其他的模块一样来实例化redis操作对象的话,系统会报找不到redis类的错误
<?php
$obj = new redis();
var_dump($obj);
?>
错误如下
Fatal_error: class redis not found……
从上面我们也可以看出php默认是不支持redis操作的。
那么我们接下来就需要自己动手了。
在linux系统下扩展
首先我们需要下载,当然在linux上下载第三方应用还是比较容易的。phpredis的源代码托管在github上,下载地址:https://github.com/phpredis/phpredis.git
# 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。
希望本文对大家有所帮助。
相关文章
使用 PHP MySQLi 函数获取最后插入的 ID
发布时间:2023/05/09 浏览次数:85 分类:MySQL
-
本篇文章简要介绍了 PHP mysqli() 函数并演示了如何使用它从 MySQL 数据库中获取最后插入的 ID。它是一个名为 mysqli 的 MySQL 驱动程序扩展版本,
在 PHP 中使用 MongoDB 作为文件存储
发布时间:2023/04/20 浏览次数:133 分类:MongoDB
-
在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。
如何在 PHP 中获取时间差的分钟数
发布时间:2023/03/29 浏览次数:183 分类:PHP
-
本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。