博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
predis如何实现phpredis的pconnect方法
阅读量:4677 次
发布时间:2019-06-09

本文共 2381 字,大约阅读时间需要 7 分钟。

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框架,但是在文档中并没有找到相关的配置参数。于是只能读插件源码,最后在/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等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。

其实从上边的代码中还可以看到很多内容:

  1. predis使用了tcp的方式连接redis,主要用到的函数是stream_socket_client(predis还有一种http的方式连接redis,主要用curl,不在这个类中)。
  2. predis并不依赖phpredis。很多项目环境安装了phpredis又在框架里安装了predis,就以为后者依赖前者,这是错误的。
  3. 在上述代码第16行还可以看到另一个参数async_connect,用于异步连接,也很重要,但是在很多文档里都没有介绍。

这里写图片描述

转载于:https://www.cnblogs.com/showersun/p/6100818.html

你可能感兴趣的文章
Android开发之蓝牙(Bluetooth)操作(一)--扫描已经配对的蓝牙设备
查看>>
查找路径php.ini文件到底在哪里?
查看>>
传统认知PK网络认知 刚子扯谈烤串认知
查看>>
字节数组java加密与解密
查看>>
矩形运算
查看>>
php 备份mysql数据库(joomla数据库可直接使用,其他数据库稍作修改即可)
查看>>
使用HttpSessionListener接口监听Session的创建和失效
查看>>
Windows Phone XNAでアニメーション - ぐるぐる
查看>>
20181029 T2 寻宝游戏
查看>>
C++变量作用域、生存期、存储类别
查看>>
数据结构期末复习(四)
查看>>
最最简单的菜单代码
查看>>
js 俩组数据根据id合并
查看>>
POJ2987 Firing 最大权闭合图
查看>>
ItelliJ IDEA下载及获取注册码详解
查看>>
ASP.NET AjaxPro的应用 .AjaxPro使用中“XXX未定义”的一种解决方法(转载的)
查看>>
谷歌和HTTPS
查看>>
Linux 系统的IP与域名解析文件[局域网的DNS]
查看>>
各种实用类
查看>>
【LGP5161】WD与数列
查看>>