predis如何实现phpredis的pconnect方法
2016-11-11 19:51
721 查看
predis和phpredis都是redis的php客户端,区别可以看这里,这里不赘述。
phpredis是php扩展,由C语言编写,诞生较早,很多PHPer都熟悉。
predis是用PHP语言编写,由于最近几年composer的盛行,以及很多框架的支持composer,存于composer库的predis也被大量应用。
pconnect()是phpredis里的方法,区别于connect(),详细了解可以看这篇,总结一下就是pconnect方法建立后的连接并不随这请求的结束而关闭,而是依赖于php-fpm进程,php-fpm进程不死,redis connect就一直存在,直到空闲超时自动断开。也就是建立了持久连接,适用于高并发下PHP请求Redis。
但是predis没有pconnect()方法,该如何实现类似的功能呢?
项目使用的是Laravel框架,但是在文档中并没有找到相关的配置参数。于是只能读插件源码,最后在
在第19行的
下边是邮件佐证,说明没有错误理解源码:
这个坑是怎么踩到的呢?还是因为框架文档的原因,目前很多PHP框架都已经支持了composer,如Laravel,Yii,CI等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。
其实从上边的代码中还可以看到很多内容:
predis使用了tcp的方式连接redis,主要用到的函数是
predis并不依赖phpredis。很多项目环境安装了phpredis又在框架里安装了predis,就以为后者依赖前者,这是错误的。
在上述代码第16行还可以看到另一个参数async_connect,用于异步连接,也很重要,但是在很多文档里都没有介绍。
phpredis是php扩展,由C语言编写,诞生较早,很多PHPer都熟悉。
predis是用PHP语言编写,由于最近几年composer的盛行,以及很多框架的支持composer,存于composer库的predis也被大量应用。
pconnect()是phpredis里的方法,区别于connect(),详细了解可以看这篇,总结一下就是pconnect方法建立后的连接并不随这请求的结束而关闭,而是依赖于php-fpm进程,php-fpm进程不死,redis connect就一直存在,直到空闲超时自动断开。也就是建立了持久连接,适用于高并发下PHP请求Redis。
但是predis没有pconnect()方法,该如何实现类似的功能呢?
项目使用的是Laravel框架,但是在文档中并没有找到相关的配置参数。于是只能读插件源码,最后在
/src/Connection/StreamConnection.php这个类中找个了实现连接redis的方法:
/** * Initializes a TCP stream resource. * * @param ParametersInterface $parameters Initialization parameters for the connection. * * @return resource */ protected function tcpStreamInitializer(ParametersInterface $parameters) { if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $address = "tcp://$parameters->host:$parameters->port"; } else { $address = "tcp://[$parameters->host]:$parameters->port"; } $flags = STREAM_CLIENT_CONNECT; if (isset($parameters->async_connect) && $parameters->async_connect) { $flags |= STREAM_CLIENT_ASYNC_CONNECT; } if (isset($parameters->persistent)) { if (false !== $persistent = filter_var($parameters->persistent, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { $flags |= STREAM_CLIENT_PERSISTENT; if ($persistent === null) { $address = "{$address}/{$parameters->persistent}"; } } } $resource = $this->createStreamSocket($parameters, $address, $flags); return $resource; }
在第19行的
$parameters->persistent我们可以看到一个陌生的参数
persistent,翻译为‘持久’。所以只要在使用predis连接redis的时候,加上参数persistent,并赋给一个true或1,就可以实现phpredis的pconnect(),简单方便。
下边是邮件佐证,说明没有错误理解源码:
Can the predis support the function pconnect() which in php-redis? Yes, just add in the connection parameters persistent=1 (when using URI strings) or persistent => true (when using a named array).
这个坑是怎么踩到的呢?还是因为框架文档的原因,目前很多PHP框架都已经支持了composer,如Laravel,Yii,CI等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。
其实从上边的代码中还可以看到很多内容:
predis使用了tcp的方式连接redis,主要用到的函数是
stream_socket_client(predis还有一种http的方式连接redis,主要用curl,不在这个类中)。
predis并不依赖phpredis。很多项目环境安装了phpredis又在框架里安装了predis,就以为后者依赖前者,这是错误的。
在上述代码第16行还可以看到另一个参数async_connect,用于异步连接,也很重要,但是在很多文档里都没有介绍。
相关文章推荐
- predis如何实现phpredis的pconnect方法
- php如何实现页面回退的两种方法
- php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
- php redis扩展支持scan命令实现方法
- 浅析PHP分布式中Redis实现Session的方法
- PHP 如何在Redis中实现事物(事物提交和事物回滚)
- 如何在PHP中实现链式方法调用
- PHP基于Redis消息队列实现发布微博的方法
- ubuntu 系统上为php加上redis 扩展的实现方法
- php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
- PHP使用redis实现统计缓存mysql压力的方法
- Redis3.0集群crc16算法php实现方法(php取得redis3.0集群中redis数据所在的redis分区插槽,并根据分区插槽取得分区所在redis服务器地址)
- php结合redis高并发下发帖、发微博的实现方法
- 如何在PHP中实现链式方法调用
- php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
- php实现redis数据库指定库号迁移的方法
- php递归函数三种实现方法及如何实现数字累加
- php实现的redis缓存类定义与使用方法示例
- PHP使用Redis实现防止大并发下二次写入的方法
- IIS中多个版本php共存的方法,IIS如何快速搭建PHP网站,多个php实现共存的神器!