Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'redis.c')
-rw-r--r--redis.c70
1 files changed, 65 insertions, 5 deletions
diff --git a/redis.c b/redis.c
index aef1613d..181a65fc 100644
--- a/redis.c
+++ b/redis.c
@@ -16,6 +16,7 @@
| Original author: Alfonso Jimenez <yo@alfonsojimenez.com> |
| Maintainer: Nicolas Favre-Felix <n.favre-felix@owlient.eu> |
| Maintainer: Nasreddine Bouafif <n.bouafif@owlient.eu> |
+ | Maintainer: Michael Grunder <michael.grunder@gmail.com |
+----------------------------------------------------------------------+
*/
@@ -227,6 +228,7 @@ static zend_function_entry redis_functions[] = {
PHP_ME(Redis, _prefix, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Redis, _unserialize, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, client, NULL, ZEND_ACC_PUBLIC)
/* options */
PHP_ME(Redis, getOption, NULL, ZEND_ACC_PUBLIC)
@@ -554,7 +556,7 @@ PHP_METHOD(Redis,__destruct) {
}
}
-/* {{{ proto boolean Redis::connect(string host, int port [, double timeout])
+/* {{{ proto boolean Redis::connect(string host, int port [, double timeout [, long retry_interval]])
*/
PHP_METHOD(Redis, connect)
{
@@ -590,6 +592,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
int host_len, id;
char *host = NULL;
long port = -1;
+ long retry_interval = 0;
char *persistent_id = NULL;
int persistent_id_len = -1;
@@ -602,9 +605,10 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
persistent = 0;
#endif
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|lds",
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|ldsl",
&object, redis_ce, &host, &host_len, &port,
- &timeout, &persistent_id, &persistent_id_len) == FAILURE) {
+ &timeout, &persistent_id, &persistent_id_len,
+ &retry_interval) == FAILURE) {
return FAILURE;
}
@@ -613,6 +617,11 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
return FAILURE;
}
+ if (retry_interval < 0L || retry_interval > INT_MAX) {
+ zend_throw_exception(redis_exception_ce, "Invalid retry interval", 0 TSRMLS_CC);
+ return FAILURE;
+ }
+
if(port == -1 && host_len && host[0] != '/') { /* not unix socket, set to default value */
port = 6379;
}
@@ -629,7 +638,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
zend_clear_exception(TSRMLS_C); /* clear exception triggered by non-existent socket during connect(). */
}
- redis_sock = redis_sock_create(host, host_len, port, timeout, persistent, persistent_id);
+ redis_sock = redis_sock_create(host, host_len, port, timeout, persistent, persistent_id, retry_interval);
if (redis_sock_server_open(redis_sock, 1 TSRMLS_CC) < 0) {
redis_free_socket(redis_sock);
@@ -6456,5 +6465,56 @@ PHP_METHOD(Redis, getAuth) {
}
}
-/* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */
+/*
+ * $redis->client('list');
+ * $redis->client('kill', <ip:port>);
+ * $redis->client('setname', <name>);
+ * $redis->client('getname');
+ */
+PHP_METHOD(Redis, client) {
+ zval *object;
+ RedisSock *redis_sock;
+ char *cmd, *opt=NULL, *arg=NULL;
+ int cmd_len, opt_len, arg_len;
+
+ // Parse our method parameters
+ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s",
+ &object, redis_ce, &opt, &opt_len, &arg, &arg_len) == FAILURE)
+ {
+ RETURN_FALSE;
+ }
+
+ // Grab our socket
+ if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
+ RETURN_FALSE;
+ }
+
+ // Build our CLIENT command
+ if(ZEND_NUM_ARGS() == 2) {
+ cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "ss", opt, opt_len,
+ arg, arg_len);
+ } else {
+ cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "s", opt, opt_len);
+ }
+
+ // Handle CLIENT LIST specifically
+ int is_list = !strncasecmp(opt, "list", 4);
+
+ // Execute our queue command
+ REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
+
+ // We handle CLIENT LIST with a custom response function
+ if(!strncasecmp(opt, "list", 4)) {
+ IF_ATOMIC() {
+ redis_client_list_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock,NULL);
+ }
+ REDIS_PROCESS_RESPONSE(redis_client_list_reply);
+ } else {
+ IF_ATOMIC() {
+ redis_read_variant_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock,NULL);
+ }
+ REDIS_PROCESS_RESPONSE(redis_read_variant_reply);
+ }
+}
+/* vim: set tabstop=4 softtabstops=4 noexpandtab shiftwidth=4: */