predis和phpredis都是redis的php客户端,区别能够看这里,这里不赘述。php
phpredis是php扩展,由C语言编写,诞生较早,不少PHPer都熟悉。
predis是用PHP语言编写,因为最近几年composer的盛行,以及不少框架的支持composer,存于composer库的predis也被大量应用。git
pconnect()是phpredis里的方法,区别于connect(),详细了解能够看这篇,总结一下就是pconnect方法创建后的链接并不随这请求的结束而关闭,而是依赖于php-fpm进程,php-fpm进程不死,redis connect就一直存在,直到空闲超时自动断开。也就是创建了持久链接,适用于高并发下PHP请求Redis。github
可是predis没有pconnect()方法,该如何实现相似的功能呢?
项目使用的是Laravel框架,可是在文档中并无找到相关的配置参数。因而只能读插件源码,最后在/src/Connection/StreamConnection.php
这个类中找个了实现链接redis的方法: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(),简单方便。并发
下边是邮件佐证,说明没有错误理解源码:composer
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等,可是并不能保证文档及时更新,尤为是中文文档,因此仍是要有阅读源码的能力。框架
其实从上边的代码中还能够看到不少内容:curl
stream_socket_client
(predis还有一种http的方式链接redis,主要用curl,不在这个类中)。