Commit Graph

1759 Commits

Author SHA1 Message Date
Daniele Alessandri 00c5d7de19 Apply minor styling fix. 2016-05-15 17:09:43 +02:00
Daniele Alessandri e3412c4a1b Move member variable initialization. 2016-05-15 16:56:50 +02:00
Daniele Alessandri 44ebf5a5e4 Prevent warnings picking slave from empty pool. 2016-05-15 16:54:57 +02:00
Daniele Alessandri 7be83a1fd6 Merge remote-tracking branch 'github/pr/332' 2016-05-13 16:59:33 +02:00
Daniele Alessandri 367ed2c11c [tests] Remove deprecated phpunit directive. 2016-05-13 16:35:10 +02:00
Daniele Alessandri f0b3014cb4 Merge remote-tracking branch 'github/pr/333' 2016-05-13 16:32:48 +02:00
Daniele Alessandri a816adf6e7 Set default parameters via client options.
This is mostly useful when configuring the client to use redis-cluster
or redis-sentinel in order to set a common password for authentication
or database. In these kind of configurations it is impossible to pass
them via connection parameters as connections are created dinamically
by the client depending on the server response.
2016-05-13 14:56:40 +02:00
Ante Braovic 7cb20f5a0c updated .gitignore 2016-05-12 16:38:46 +02:00
Ante Braovic 62c547601c added zrevrangebylex in the list of available methods 2016-05-12 16:27:17 +02:00
Daniele Alessandri 104e42cfe0 [tests] Fix test executed on current Redis unstable. 2016-05-10 10:58:46 +02:00
Daniele Alessandri b6a14cda04 [tests] Fix test executed on current Redis unstable. 2016-05-10 10:51:43 +02:00
Daniele Alessandri e61cb4e4f2 [tests] Fix wrong @group annotation 2016-05-09 17:49:12 +02:00
Daniele Alessandri 1349666494 Update CHANGELOG.
[ci skip]
2016-05-08 18:56:25 +02:00
Daniele Alessandri a0487ec5f4 Prevent failures serializing commands with "holes" in arguments array.
This could be triggered when passing an array with "holes" to variadic commands.
Connection classes based on the protocol serialized exposed by phpiredis were
not affected by this bug.

Fixes #316.
2016-05-08 18:43:50 +02:00
Remi Collet 57a7d5d3e6 fix tests, list of allowed commands have changed (redis 3.0.6) 2016-05-08 16:52:05 +02:00
Alexander Cheprasov 8235228acd Update ClientInterface.php 2016-05-08 16:46:27 +02:00
John Maguire 3ceaa39a3c Update useClusterNodes() docs to indicate default 2016-05-08 15:21:11 +02:00
Daniele Alessandri 0baad16064 Fix bug in HSCAN-based iterator when hash have integer fields.
When iterating a hash containing integer fields our iterator abstraction
based on HSCAN was always returning "0" as a field name after the first
$field => $value pair due to a wrong assumption on how the PHP function
array_shift() (which is used internally to advance to the next pair in
our buffered response to HSCAN) works.

The ZSCAN-based iterator had this very same bug which was already fixed
in 24e19a9 so I am not sure how this one went unnoticed until now.
2016-05-08 15:16:05 +02:00
Ante Lucic 939c0821dd add docblocks to MasterSlaveReplication 2016-05-05 14:22:32 +02:00
Daniele Alessandri 6bc1a38123 Fix wrong link in phpdoc.
Fixes #270.

[ci skip]
2015-07-30 20:51:15 +02:00
Daniele Alessandri f7d7cd59c4 Update CHANGELOG with release details of v1.0.3.
[ci skip]
2015-07-30 20:38:21 +02:00
Daniele Alessandri d46de81d91 Fix severe regression on HHVM.
Apparently HHVM is more strict than PHP in stream_socket_client() and does not
like at all IPv4 addresses and hostnames eclosed in square brackets. Note that
it is not that weird as square brackets are mandatory only when IPv6 addresses
are embedded in URI strings, so it is more like a weird incompatiblity of HHVM
with the behaviour of the standard PHP interpreter. The connect() attempt fails
but not due to the server being unavailable or some connectivity issue.

The important lesson is: never rely on undocumented behaviours especially when
targeting different runtimes, and do not forget to run the test suite on every
platform right before release like I unfortunately did.
2015-07-30 20:22:37 +02:00
Daniele Alessandri f4b6c578be Update CHANGELOG with release details of v1.0.2.
[ci skip]
2015-07-30 11:21:36 +02:00
Daniele Alessandri 2fc0e56a09 Preserve remainder of path in URI after database (redis scheme). 2015-07-30 11:11:30 +02:00
Daniele Alessandri 8106c8b00a Use PHP_VERSION_ID constant. 2015-07-30 10:57:20 +02:00
Daniele Alessandri b8bfd1405d Update README.
[ci skip]
2015-07-30 10:50:14 +02:00
Daniele Alessandri a7ee80702c Implement full support for IPv6.
Using IPv6 with Predis was basically impossible due to various inconsistencies
and bugs through the library, now it is supported by all the connection classes.

Following the standard for IPv6 literal addresses in URI strings, the IP literal
must be enclosed within square brackets when passing the parameters as a string:

  $parameters = 'tcp://[2001:db8:0:f101::1]:6379';

See https://tools.ietf.org/html/rfc3986#section-3.2.2 for further details.

This commit also fixes #239 making redis-cluster usable with nodes using IPv6.
2015-07-29 23:01:55 +02:00
Daniele Alessandri 0eaa1d929d Reduce unneeded code duplication in URI parsing. 2015-07-29 17:00:12 +02:00
Daniele Alessandri a26390915d Strip brackets from host when parsing embedded IPv6 address.
I don't know why PHP's parse_url() does not do that, it does not make
sense when the IP is by itself so maybe it is a bug?
2015-07-29 16:44:11 +02:00
Daniele Alessandri 24c0f846c7 Use static:: for invoking static methods in key prefix processor.
This trivial change makes it possible to use overridden static methods
when extending Predis\Command\Processor\KeyPrefixProcessor. PHP always
invokes the static methods of a parent class when using self:: even if
the extended classes override them.
2015-07-29 12:28:44 +02:00
Daniele Alessandri f43433baf1 Add new command: HSTRLEN (Redis 3.2.0).
Also bump the unstable profile version to 3.2.
2015-07-29 11:50:20 +02:00
Daniele Alessandri 3dfe62a5b5 Change format required for URI strings when using "unix" scheme.
Instead of using "unix://" you should just use "unix:":

  $old = 'unix:///path/to/redis.sock';
  $new = 'unix:/path/to/redis.sock';

The old format should be considered obsolete and will not be supported
starting from the next major release of Predis.
Meh
2015-07-28 11:23:33 +02:00
Daniele Alessandri ebb72377bb Implement TLS/SSL-encrypted connections.
This is handy for accessing remote Redis instances over a secure SSL connection
which is currently a popular option or even requirement with many cloud hosting
environments.

In order to configure the client to use an SSL-encrypted connection the scheme
in the connection parameters must be either "tsl" or "rediss" and a set of SSL
options (see http://php.net/manual/en/context.ssl.php) must be provided via the
"ssl" parameter as a named array.

The following example (which does not necessarily represent an example of good
practices!) illustrates how to set the "ssl" parameter using a named array and
the equivalent URI string:

  // Parameters as named array
  $parameters = [
    'scheme' => 'tls',
    'host'   => '127.0.0.1',
    'ssl'    => [
        'cafile'            => '/home/adaniele/redis.pem',
        'verify_peer_name'  => false,
    ],
  ];

  // Parameters as URI string
  $parameters = 'tls://127.0.0.1?ssl[cafile]=redis.pem&ssl[verify_peer_name]=1';

Support for SSL is currently limited to the Predis\Connection\StreamConnection
backend but we intend to investigate if it is possible to extend this feature
to Predis\Connection\PhpiredisStreamConnection in the future.

Be aware that using encrypted connections may lead to a performance degradation
especially in the connect() operation due to the overhead of the TLS handshake.
Unfortunately there is no real way to reuse SSL sessions from userland, aside
from enabling persistent connections, but this will work only on PHP >= 7.0.0
because previous versions of PHP do not provide enough info about a stream from
get_stream_meta_data().

NOTE: Redis does not have built-in support for SSL-encrypted connections, but if
you want to expose it to public networks you may want to rely on "stunnel".
2015-07-27 19:16:20 +02:00
Daniele Alessandri cb91ad1aee Rephrase latest entries of the CHANGELOG.
[ci skip]
2015-07-26 22:34:20 +02:00
Daniele Alessandri 5172555009 Rephrase some parts of the README.
[ci skip]
2015-07-26 22:28:58 +02:00
Daniele Alessandri 4dea992cd2 [tests] Fix typo. 2015-07-25 21:58:52 +02:00
Daniele Alessandri 80af1af459 [tests] Require pcntl extension to run blocking PubSub\Consumer test. 2015-07-25 21:56:36 +02:00
Daniele Alessandri abf2ce0bd1 [tests] Exlude persistent connections tests under PHP 5.3.
The get_resource_type() function does not differentiate between normal streams
and persistent streams, so we cannot really test this case.
2015-07-25 21:52:55 +02:00
Daniele Alessandri c7cae66a97 [tests] Improve code-reuse in tests for the Predis\Connection namespace. 2015-07-25 21:32:36 +02:00
Daniele Alessandri 4f30ac6370 Run php-cs-fixer. 2015-07-25 19:13:05 +02:00
Daniele Alessandri 1c8eb7ff6b [tests] Share common test among connection classes. 2015-07-25 19:13:01 +02:00
Daniele Alessandri cb09a7a2b5 [tests] Use @requires annotation. 2015-07-25 18:37:11 +02:00
Daniele Alessandri d69d6c726d Remove Connection\Aggregate\RedisCluster::setDefaultParameters().
The redis-cluster connection relies on a client-initialized connection factory,
so use Connection\Factory::setDefaultParameters() to set the default parameters
that must be applied to new nodes discovered through -MOVED or -ASK responses.
2015-07-25 18:37:11 +02:00
Daniele Alessandri 2b0c8fbb26 Remove "timeout" as a default parameter in Connection\Parameters.
Falling back to a default timeout values should be done by the connection class
as it is an implementation detail that may vary depending on the backend.
2015-07-25 18:37:11 +02:00
Daniele Alessandri 55aab86800 Add support for default connection parameters in Connection\Factory.
These parameters augment the set of user-supplied parameters when creating a new
connection, but they do not override specific parameters when already defined.

An example of self-contained configuration using client options:

  $client = new Predis\Client('tcp://127.0.0.1', [
    'parameters' => [
      'timeout' => 10,
    ],
    'connections' => function ($options) {
      $factory = $options->getDefault('connections');
      $factory->setDefaultParameters($options->parameters);

      return $factory;
    },
  ]);

This change will be useful for both redis-cluster and redis-sentinel as it makes
it easy to apply shared parameters such as a common password for authentication
when the server returns one ore more new nodes from response (think of -MOVED).
2015-07-25 18:37:11 +02:00
Daniele Alessandri 6cce9eb35c Run php-cs-fixer. 2015-07-25 18:37:10 +02:00
Daniele Alessandri 8277afc7a8 Use "persistent" with non-bool strings to open different persistent connections.
stream_socket_client() has the undocumented ability to open different persistent
streams by providing a path in the $address string. Previously we supported this
behaviour with a combination of "persistent" and "path" (see #139) but this can
be confusing, especially now that we support the redis:// scheme which uses the
path part of an URI string to specify a database number.

After this change, instead of using an URI string such as:

  $parameters = 'tcp://127.0.0.1/first?persistent=1&database=5';

You should use the following ones:

  $parameters = 'tcp://127.0.0.1?persistent=first&database=5';
  $parameters = 'redis://127.0.0.1/5?persistent=first';

Avoiding "path" makes even more sense when using array connection parameters:

  $parameters = [
    'host'       => '127.0.0.1',
    'database'   => 5,
    'persistent' => 'first',
  ]

This feature is not supported when using UNIX domain sockets because the path
trick of stream_socket_client() does not play well with the actual path of the
socket file. The client will throw an InvalidArgumentException exception to
notify the user.

NOTE: unfortunately we have to disable the tests for persistent connections when
running under HHVM due to a bug in their implementation of get_resource_type()
preventing us to recognize a persistent stream from userland code.
2015-07-25 18:34:51 +02:00
Daniele Alessandri b012af3247 Reorganize stream resource creation for stream-based connections. 2015-07-25 14:39:05 +02:00
Daniele Alessandri 7fa3c55f51 Move assertion for connection parameters out of abstract connection class.
Each connection class should implement its own checks for connection parameters,
even at the cost of some code duplication (inheritance is not just about code
reuse after all).
2015-07-25 14:37:22 +02:00
Daniele Alessandri 73c9b9d5be [tests] Fix some tests methods names. 2015-07-25 10:04:27 +02:00