Commit Graph

109 Commits

Author SHA1 Message Date
Daniele Alessandri fdf63bc03d Make Predis compatible with HHVM (at least 2.3.0).
Achieving compatibility actually required a few marginal changes:

  - HHVM still has some issues with re-entrant calls to __get(). The
    applied change is an hack simply because it is ugly, but it is not
    wrong and does not break the signature of the options interface.
  - Since we cannot rely on the PHP version to detect the availability
    of socket_import_stream(), we switched to function_exists(). As an
    added bonus, using function_exists() is twice faster.
  - In the test suite we removed an assertion for the message of an
    E_WARNING simply because HHVM emits a different message. Checking
    for the warning is actually enough in that context.

While the whole test suite passes on HHVM 2.3.0, please remember that
HHVM is still in development and things could break anytime especially
in some obscure corner cases.
2013-12-17 16:09:20 +01:00
Daniele Alessandri 02e43143d3 Run php-cs against codebase. 2013-12-17 12:53:36 +01:00
Daniele Alessandri 1125dc1bdd Apply minor change in command serialization. 2013-12-16 18:46:17 +01:00
Daniele Alessandri 0f34f41ccf Fix and reword some exception messages. 2013-12-16 15:13:18 +01:00
Daniele Alessandri 7e89719ceb Revert usage of "short" namespaces in use directives.
We started using partially-qualified names as an experiment but we are
reverting to using fully-qualified names + aliases in use directives.
2013-12-15 17:00:45 +01:00
Daniele Alessandri 58c5029574 Rename Predis\Connection\AggregatedConnectionInterface. 2013-12-15 12:38:21 +01:00
Daniele Alessandri 6ceebbfbec Rename Predis\Connection\SingleConnectionInterface::pushInitCommand().
The new name is more explicit as it makes obvious that the commands
added with it will be executed upon connect().
2013-12-15 11:25:38 +01:00
Daniele Alessandri c40ad5dd47 Rename Predis\Connection\ConnectionParameters. 2013-12-15 10:22:23 +01:00
Daniele Alessandri 2a7607f128 Rename Predis\Connection\ConnectionFactory. 2013-12-15 10:09:08 +01:00
Daniele Alessandri fded76bca3 Merge branch 'v0.9/connection-persistent-path' 2013-12-14 14:16:54 +01:00
Daniele Alessandri e7f2d28f23 Use path to differentiate persistent TCP streams.
Closes #139.
2013-12-14 14:15:41 +01:00
Daniele Alessandri 5eb975ef69 Improve URI parsing for connection parameters.
Using PHP's "parse_str()" to parse the query string is slightly more
efficient then our own code especially when the number of fields in
the query string grows, with the additional benefit of supporting
arrays for values when brackets are present in fieldnames.

So after this commit, providing this URI string:

  $string = 'tcp://127.0.0.1?metavars[]=foo&metavars[]=hoge';

Is equivalent to providing the following named array:

  $array = [
    'scheme' => 'tcp',
    'host' => '127.0.0.1',
    'metavars' => ['foo', 'hoge'],
  ];

Aside from this improvement, the URI parsing behavior has not changed.
2013-12-11 12:45:47 +01:00
Daniele Alessandri 3fbc012c03 Add "path" in phpdoc of connections supporting UNIX domain sockets. 2013-12-11 12:20:10 +01:00
Daniele Alessandri cebdf889a4 Rename connection to Predis\Connection\PhpiredisSocketConnection. 2013-12-10 22:14:34 +01:00
Daniele Alessandri 95b9f63cab Rename write and read methods of the composable connection interface. 2013-12-10 21:26:11 +01:00
Daniele Alessandri 59b5658cf5 Big batch of phpdoc improvements and minor code styling fixes. 2013-12-10 19:21:52 +01:00
Daniele Alessandri 8744285cb3 Ignoring the plural form of "reply" for renames is dumb...
[ci skip]
2013-12-10 18:08:14 +01:00
Daniele Alessandri 14fda643f7 Replace remaining occurrences of "reply" with "response". 2013-12-10 15:54:41 +01:00
Daniele Alessandri 5acdab9176 Merge branch 'v0.9/redis-cluster-fix'
Conflicts:
	lib/Predis/Connection/RedisCluster.php
2013-12-08 15:24:52 +01:00
Daniele Alessandri 35023dd83f Use a more appropriate exception. 2013-12-08 15:12:35 +01:00
Daniele Alessandri 70df7ca64d Apply common parameters to connections created on the fly in cluster.
These parameters are applied only to connections being created on the
fly when not part of the current pool. This condition usually happens
upon -MOVE or -ASK responses returned by Redis to redirect client to
different nodes.
2013-12-08 15:12:28 +01:00
Daniele Alessandri f0549b5dad Rewrite phpdoc comments for the redis-cluster connection backend. 2013-12-08 12:43:24 +01:00
Daniele Alessandri b7ac7595c2 Change signature of the connection parameters class constructor.
Only named arrays are explicitly accepted now, but the old behaviour
of creating a connection parameters instance out of an URI string or
a named array is still available using the "create()" static method.

  $array = ['host' => '127.0.0.1', 'timeout' => 1];
  $uri = 'tcp://127.0.0.1?timeout=1';

  $parameters = new ConnectionParameters($array);      // Arrays only
  $parameters = ConnectionParameters::create($array);  // Arrays OK
  $parameters = ConnectionParameters::create($uri);    // Strings OK

The purpose of the change is to have a more concise constructor with a
well defined signature.
2013-12-08 11:35:53 +01:00
Daniele Alessandri 1f66f4e8f7 Various fixes and improvements to redis-cluster connection backend.
List of changes:

  - The cluster connection can be initialized with a partial list of
    nodes, the full slots map will be fetched from Redis itself using
    the CLUSTER NODES command.
  - The slots map can be optionally retrieved from Redis if the server
    returns a -MOVE response, otherwise only the interested slot will
    be permanently reassigned to the new target node.
  - $cluster->connect() connects to a random connection in the pool
    instead of forcing the connect operation on all the connections.
2013-12-07 21:19:52 +01:00
Daniele Alessandri 73eb09378e Remove obsolete comments.
The phpiredis-based connection backends are not experiments anymore.

[ci skip]
2013-12-07 15:59:28 +01:00
Daniele Alessandri 427309db69 Apply code styling fixes.
There is actually no need for such indentations.
2013-12-07 15:41:45 +01:00
Daniele Alessandri 373d30b070 Use Predis\Response\Status to identify all kinds of status responses.
Status response objects are needed mostly to make it possible from the
client perspective to differentiate a status response with the payload
"OK" from a normale bulk reply containing "OK".

The biggest change is for commands returning +OK responses: these were
previously translated to TRUE (bool value), but they are now returned
as instances of Predis\Response\Status. Just to illustrate an example
of the possibilities with this change we will use SET since it is the
most widely used command returning +OK:

  $response = $client->set('foo', 'bar');

  echo $response;         // 'OK'
  $response == 'OK';      // TRUE
  isset($response->ok);   // TRUE
  $response == true;      // TRUE
  $response === true;     // FALSE
  $response instanceof Predis\Response\ObjectInterface;     // TRUE
  $response instanceof Predis\Response\Status;              // TRUE

For those checking responses returned by commands such as SET or PONG,
the breaking change basically lies in the usage of strict comparison:
doing $response === true will now evaluate to FALSE instead of TRUE.

By default Predis caches common status responses such as OK or QUEUED
to lower the memory usage when using pipelines or transactions.
2013-12-07 15:15:23 +01:00
Daniele Alessandri cf70d2f20e Minor code styling changes in Predis\Connection. 2013-12-02 16:05:05 +01:00
Daniele Alessandri ccf8822b4b Minor change in stream connection destructor. 2013-12-02 15:45:29 +01:00
Daniele Alessandri d27d3b0acb Cache value casters in static member variable.
This optimization is mostly useful since connection parameters can be
instantiated more than one time in a script when using clustering or
replication.
2013-12-02 14:34:02 +01:00
Daniele Alessandri 5b7504b069 Simplify connection factory class by removing dependency on profile.
A profile is not needed to create instances of basic initialization
commands such as AUTH (authentication) and SELECT (database selection)
since they do not need prefixing and other stuff.

If needed, developers can still extend the base connection factory to
make it use a server profile and configure the client to use it using
options.
2013-12-02 13:01:37 +01:00
Daniele Alessandri 4bf0ee4c6a Rename ConnectionInterface::writeCommand() to writeRequest().
This name is more consistent with its counterpart, readResponse().
2013-12-02 11:08:14 +01:00
Daniele Alessandri 5d7f297110 Send ASKING command when redis-cluster returns a -ASK response.
We must always execute ASKING on the connection identified by the -ASK
response before executing the actual command because not doing so will
break the cluster specifications while redis-cluster is performing a
resharding operation.
2013-11-30 17:37:37 +01:00
Daniele Alessandri 4840736503 Apply some minor internal changes to concrete connection classes. 2013-11-23 11:08:38 +01:00
Daniele Alessandri 2a5483df90 Reorganize the Predis\Profile namespace.
The profile factory code has been extrapolated into a the new class
Predis\Profile\Factory (final and with only static methods).
2013-11-22 12:01:29 +01:00
Daniele Alessandri c6f51e82bf Rename "Array" type-hint to to "array". 2013-11-16 17:01:58 +01:00
Daniele Alessandri e6f1788e27 Rename interfaces and classes in the Predis\Cluster namespace.
A few methods were renamed accordingly for consistency
2013-11-16 16:21:27 +01:00
Daniele Alessandri b71c798f9b Rename classes in Predis\Response and Predis\Response\Iterator.
This change aims to make class names shorter with less redundant fully
qualified names.

Merge!
2013-11-16 14:01:11 +01:00
Daniele Alessandri a8edc02eb6 Create the Predis\Response namespace.
All of the response interface, classes and exceptions have been moved
into this namespace.
2013-11-16 11:59:33 +01:00
Daniele Alessandri 8d15e5ec08 Do not pipeline initialization commands. 2013-11-12 18:16:54 +01:00
Daniele Alessandri 6fbc421b96 Fix URI parsing on multiple equal signs in pair value of query string. 2013-11-12 12:46:45 +01:00
Daniele Alessandri 5e90e615b1 Minor optimizations for the parsing of URI parameters.
Using list() with the warning suppressor is slower than using isset()
to check the presence of the first two elements of the array returned
by explode(). This also allow us to skip incomplete query string pairs
when parsing the URI string.

We have also changed the exception being thrown on invalid URIs to a
more appropriate one.
2013-11-11 18:59:21 +01:00
Daniele Alessandri 321d2624ab Rename URI parsing method of Predis\Connection\ConnectionParameters. 2013-11-11 18:30:42 +01:00
Daniele Alessandri acd29ec076 Slightly change interface for connection factories. 2013-11-11 18:24:20 +01:00
Daniele Alessandri 3c6389f4dd Rework how connection parameters are handled.
These changes do not affect the actual functionalities of the client,
but make the code more explicit and less error-prone.
2013-11-11 18:17:09 +01:00
Daniele Alessandri f36138c0b7 Minor internal change.
Check directly the private parameters array instead of passing through
method dispatching for the outer __isset() method.
2013-11-11 15:28:42 +01:00
Daniele Alessandri 9136033eea Rationalize API renaming or moving stuff in Predis\Protocol namespace. 2013-11-09 18:36:28 +01:00
Daniele Alessandri 16d17af577 Rework the API for external protocol processors. 2013-11-09 17:10:07 +01:00
Daniele Alessandri fb2d8a37c1 Drop support for streamable multibulk responses.
Supporting this feature has been problematic and leaded to some ugly
code to make abstractions such as pipelines and transactions aware of
these kind of response objects. Furthermore, it was not possible to
add them to all the connection classes due to implementation limits.

For such reasons Predis do not support them globally anymore, but the
actual classes are still shipped within the library so that they can
be used to build custom stuff at a level lower than client (that is,
unless we decide to remove them for good before going stable).
2013-11-09 12:07:36 +01:00
Alexandru Patranescu 2d2930d24f some PHPDoc fixes in lib
and removed some unused imports also
2013-06-03 00:06:41 +03:00