@@ -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