如题,我正在寻找一个支持持久连接的php Redis客户端,因为我的Web应用程序接收了大量请求(每个请求都会将一个项目放入Redis队列中),我希望避免在每个请求中创建新的连接。
如题,我正在寻找一个支持持久连接的php Redis客户端,因为我的Web应用程序接收了大量请求(每个请求都会将一个项目放入Redis队列中),我希望避免在每个请求中创建新的连接。
我不确定这是否被支持,但你应该一定要看看Predis和Rediska,这两个库(特别是Predis)是目前最好的PHP Redis客户端。
PhpRedis目前支持持久连接。使用PHP 7.0和PhpRedis 3.0,可以像这样使用pconnect()
建立持久连接:
for ($i=0;$i<1000;$i++) {
$redis = new Redis();
$result = $redis->pconnect('127.0.0.1');
$redis->set("iterator",$i);
$response=$redis->get("iterator");
$redis->close();
unset($redis);
}
与connect()
相比,速度约快10倍(每个连接9.6毫秒对0.83毫秒):
for ($i=0;$i<1000;$i++) {
$redis = new Redis();
$result = $redis->connect('127.0.0.1');
$redis->set("iterator",$i);
$response=$redis->get("iterator");
$redis->close();
unset($redis);
}
Predis支持持久连接。您只需将persistent参数添加为1。
您可以使用以下代码:
$client = new Predis\Client(array(
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 15,
'persistent'=> 1
));
替代
$client = new Predis\Client('tcp://127.0.0.1:6379?database=15');
您可以在此处找到有关连接的更多参数: https://github.com/nrk/predis/wiki/Connection-Parameters
Predis自v0.8.0版本开始,使用PhpiredisStreamConnection
和persistent=1
标志语法支持持久连接:
<?php
$client = new Predis\Client('tcp://127.0.0.1?persistent=1', array(
'connections' => array(
'tcp' => 'Predis\Connection\PhpiredisStreamConnection',
'unix' => 'Predis\Connection\PhpiredisStreamConnection',
),
);
PHP-Redis支持持久连接,因为它使用了一个用C语言编写的php扩展,这使得它具有在请求之间共享连接的机制。请查看popen和pconnect的文档。
Predis无法支持持久连接,因为它是100% PHP,而PHP在每个请求之间不共享任何内容。
popen()
本来就是错误的资源类型(p == 管道进程)。pconnect()
完全能够支持Zend内部的“xport”资源处理,从而允许维护持久连接。Predis本身使用stream_socket_client(),带有可选的STREAM_CLIENT_PERSISTENT
标志。当PHP进程由像Apache这样的后端进程/线程池维护时,这些持久连接在后端的生命周期内保持存在。 - Joe