@@ -227,6 +227,7 @@ static zend_function_entry redis_functions[] = {
227227 PHP_ME (Redis , _prefix , NULL , ZEND_ACC_PUBLIC )
228228 PHP_ME (Redis , _unserialize , NULL , ZEND_ACC_PUBLIC )
229229
230+ PHP_ME (Redis , client , NULL , ZEND_ACC_PUBLIC )
230231
231232 /* options */
232233 PHP_ME (Redis , getOption , NULL , ZEND_ACC_PUBLIC )
@@ -524,7 +525,7 @@ PHP_METHOD(Redis,__destruct) {
524525 }
525526}
526527
527- /* {{{ proto boolean Redis::connect(string host, int port [, double timeout])
528+ /* {{{ proto boolean Redis::connect(string host, int port [, double timeout [, long retry_interval] ])
528529 */
529530PHP_METHOD (Redis , connect )
530531{
@@ -560,6 +561,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
560561 int host_len , id ;
561562 char * host = NULL ;
562563 long port = -1 ;
564+ long retry_interval = 0 ;
563565
564566 char * persistent_id = NULL ;
565567 int persistent_id_len = -1 ;
@@ -572,9 +574,10 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
572574 persistent = 0 ;
573575#endif
574576
575- if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Os|lds " ,
577+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Os|ldsl " ,
576578 & object , redis_ce , & host , & host_len , & port ,
577- & timeout , & persistent_id , & persistent_id_len ) == FAILURE ) {
579+ & timeout , & persistent_id , & persistent_id_len ,
580+ & retry_interval ) == FAILURE ) {
578581 return FAILURE ;
579582 }
580583
@@ -583,6 +586,11 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
583586 return FAILURE ;
584587 }
585588
589+ if (retry_interval < 0L || retry_interval > INT_MAX ) {
590+ zend_throw_exception (redis_exception_ce , "Invalid retry interval" , 0 TSRMLS_CC );
591+ return FAILURE ;
592+ }
593+
586594 if (port == -1 && host_len && host [0 ] != '/' ) { /* not unix socket, set to default value */
587595 port = 6379 ;
588596 }
@@ -599,7 +607,7 @@ PHPAPI int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
599607 zend_clear_exception (TSRMLS_C ); /* clear exception triggered by non-existent socket during connect(). */
600608 }
601609
602- redis_sock = redis_sock_create (host , host_len , port , timeout , persistent , persistent_id );
610+ redis_sock = redis_sock_create (host , host_len , port , timeout , persistent , persistent_id , retry_interval );
603611
604612 if (redis_sock_server_open (redis_sock , 1 TSRMLS_CC ) < 0 ) {
605613 redis_free_socket (redis_sock );
@@ -6304,5 +6312,56 @@ PHP_METHOD(Redis, time) {
63046312 REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_raw );
63056313}
63066314
6307- /* vim: set tabstop=4 softtabstop=4 noexpandtab shiftwidth=4: */
6315+ /*
6316+ * $redis->client('list');
6317+ * $redis->client('kill', <ip:port>);
6318+ * $redis->client('setname', <name>);
6319+ * $redis->client('getname');
6320+ */
6321+ PHP_METHOD (Redis , client ) {
6322+ zval * object ;
6323+ RedisSock * redis_sock ;
6324+ char * cmd , * opt = NULL , * arg = NULL ;
6325+ int cmd_len , opt_len , arg_len ;
6326+
6327+ // Parse our method parameters
6328+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Os|s" ,
6329+ & object , redis_ce , & opt , & opt_len , & arg , & arg_len ) == FAILURE )
6330+ {
6331+ RETURN_FALSE ;
6332+ }
6333+
6334+ // Grab our socket
6335+ if (redis_sock_get (object , & redis_sock TSRMLS_CC , 0 ) < 0 ) {
6336+ RETURN_FALSE ;
6337+ }
6338+
6339+ // Build our CLIENT command
6340+ if (ZEND_NUM_ARGS () == 2 ) {
6341+ cmd_len = redis_cmd_format_static (& cmd , "CLIENT" , "ss" , opt , opt_len ,
6342+ arg , arg_len );
6343+ } else {
6344+ cmd_len = redis_cmd_format_static (& cmd , "CLIENT" , "s" , opt , opt_len );
6345+ }
6346+
6347+ // Handle CLIENT LIST specifically
6348+ int is_list = !strncasecmp (opt , "list" , 4 );
6349+
6350+ // Execute our queue command
6351+ REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
6352+
6353+ // We handle CLIENT LIST with a custom response function
6354+ if (!strncasecmp (opt , "list" , 4 )) {
6355+ IF_ATOMIC () {
6356+ redis_client_list_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,redis_sock ,NULL );
6357+ }
6358+ REDIS_PROCESS_RESPONSE (redis_client_list_reply );
6359+ } else {
6360+ IF_ATOMIC () {
6361+ redis_read_variant_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,redis_sock ,NULL );
6362+ }
6363+ REDIS_PROCESS_RESPONSE (redis_read_variant_reply );
6364+ }
6365+ }
63086366
6367+ /* vim: set tabstop=4 softtabstops=4 noexpandtab shiftwidth=4: */
0 commit comments