Predis v0.8.3
Predis is a flexible and feature-complete PHP (>= 5.3.2) client library for Redis.
This is a maintenance release for the 0.8 series shipping some new features and minor micro-optimizations. What follows is an overview of the new features and changes introduced in this new release, for a more in-depth list of changes please see the CHANGELOG.
New features and changes
CLIENT SETNAME and CLIENT GETNAME
Thanks to Raphael Stolt's pull request you can now use CLIENT SETNAME
and CLIENT GETNAME
.
New stream-based phpiredis connection backend
We've had a connection backend based on the phpiredis extension for quite some time now, but it required the socket
extension to be loaded in order to work. Now there's a new connection backend which still relies on phpiredis to parse and serialize the Redis protocol, but internally uses PHP's native streams. One of the benefits of using streams is that they support persistent connections when used with plain FastCGI or php-fpm processes. Client configuration to make use of this connection backend is the same as usual, you just need to specify the Predis\Connection\PhpiredisStreamConnection
class:
<?php
$client = new Predis\Client('tcp://127.0.0.1', array(
'connections' => array(
'tcp' => 'Predis\Connection\PhpiredisStreamConnection',
'unix' => 'Predis\Connection\PhpiredisStreamConnection',
),
);
TCP_NODELAY with stream-based connections (PHP >= 5.4.0 only)
One of the historic downsides of using stream-wrapped sockets has always been the impossibility of tinkering with socket options, but luckily for us the introduction of socket_import_stream() in PHP 5.4 removed this limitation. This make it possible to set the TCP_NODELAY
socket option to enable or disable Nagle's algorithm using the tcp_nodelay
connection parameter:
<?php
$client = new Predis\Client('tcp://127.0.0.1?tcp_nodelay=0');
You can effectively set any kind of socket option by yourself in your library or application's code with something like:
<?php
$client = new Predis\Client('tcp://127.0.0.1');
$socket = socket_import_stream($client->getConnection()->getResource());
socket_set_option($socket, SOL_TCP, TCP_NODELAY, 0);
Callable objects for$parameters
in client constructor
Additionally to strings, arrays or even instances of Predis\Connection\ConnectionInterface
, now the first argument of Predis\Client::__construct()
can accept callable objects returning instances of Predis\Connection\ConnectionInterface
. This may appear as an unnecessary addition, but it can reveal itself useful to create custom and self-contained solutions to handle complex configuration scenarios. As an (admittedly) extreme example, we relied on this feature to wrap the code needed to use client-side sharding to distribute keys among virtual nodes of replicated Redis instances without further changing the library's code.
Minor non-breaking change in Lua scripting abstraction
When instructing scripted commands to use all the arguments to populate the ARGV
table and leave KEYS
empty on Lua's side, developers were required to return FALSE
(strictly boolean) from getKeysCount()
in their command implementation. This choice didn't make much sense and now you can simply return 0
. This change does not break existing code since 0 == FALSE
in PHP.
Changes in redis-cluster distribution
Salvatore recently started working again on redis-cluster (that alone is an awesome news!) and commited a change raising the number of hash slots used for distribution, from 4096 to 16384. Our aggregated connection for redis-cluster has been updated accordingly, so pay attention when upgrading both Redis and Predis if you were brave enough having something based on it.