@@ -70,7 +70,7 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval, zend_bool b
7070 call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_cons , & z_ret , 0 , NULL TSRMLS_CC );
7171
7272 /* create socket */
73- redis_sock = redis_sock_create (host , host_len , port , 0 , ra -> pconnect , NULL , retry_interval , b_lazy_connect );
73+ redis_sock = redis_sock_create (host , host_len , port , ra -> connect_timeout , ra -> pconnect , NULL , retry_interval , b_lazy_connect );
7474
7575 if (!b_lazy_connect )
7676 {
@@ -166,12 +166,14 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
166166 zval * z_params_autorehash ;
167167 zval * z_params_retry_interval ;
168168 zval * z_params_pconnect ;
169+ zval * z_params_connect_timeout ;
169170 zval * z_params_lazy_connect ;
170171 RedisArray * ra = NULL ;
171172
172173 zend_bool b_index = 0 , b_autorehash = 0 , b_pconnect = 0 ;
173174 long l_retry_interval = 0 ;
174175 zend_bool b_lazy_connect = 0 ;
176+ double d_connect_timeout = 0 ;
175177 HashTable * hHosts = NULL , * hPrev = NULL ;
176178
177179 /* find entry */
@@ -264,12 +266,27 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
264266 sapi_module .treat_data (PARSE_STRING , estrdup (INI_STR ("redis.arrays.lazyconnect" )), z_params_lazy_connect TSRMLS_CC );
265267 if (zend_hash_find (Z_ARRVAL_P (z_params_lazy_connect ), name , strlen (name ) + 1 , (void * * ) & z_data_pp ) != FAILURE ) {
266268 if (Z_TYPE_PP (z_data_pp ) == IS_STRING && strncmp (Z_STRVAL_PP (z_data_pp ), "1" , 1 ) == 0 ) {
269+ /* find connect timeout option */
270+ MAKE_STD_ZVAL (z_params_connect_timeout );
271+ array_init (z_params_connect_timeout );
272+ sapi_module .treat_data (PARSE_STRING , estrdup (INI_STR ("redis.arrays.connecttimeout" )), z_params_connect_timeout TSRMLS_CC );
273+ if (zend_hash_find (Z_ARRVAL_P (z_params_connect_timeout ), name , strlen (name ) + 1 , (void * * ) & z_data_pp ) != FAILURE ) {
274+ if (Z_TYPE_PP (z_data_pp ) == IS_DOUBLE || Z_TYPE_PP (z_data_pp ) == IS_STRING ) {
275+ if (Z_TYPE_PP (z_data_pp ) == IS_DOUBLE ) {
276+ d_connect_timeout = Z_DVAL_PP (z_data_pp );
277+ }
278+ else {
279+ d_connect_timeout = atol (Z_STRVAL_PP (z_data_pp ));
280+ }
281+ }
282+ }
283+
267284 b_lazy_connect = 1 ;
268285 }
269286 }
270287
271288 /* create RedisArray object */
272- ra = ra_make_array (hHosts , z_fun , z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect TSRMLS_CC );
289+ ra = ra_make_array (hHosts , z_fun , z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect , d_connect_timeout TSRMLS_CC );
273290 ra -> auto_rehash = b_autorehash ;
274291
275292 /* cleanup */
@@ -287,14 +304,16 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
287304 efree (z_params_retry_interval );
288305 zval_dtor (z_params_pconnect );
289306 efree (z_params_pconnect );
307+ zval_dtor (z_params_connect_timeout );
308+ efree (z_params_connect_timeout );
290309 zval_dtor (z_params_lazy_connect );
291310 efree (z_params_lazy_connect );
292311
293312 return ra ;
294313}
295314
296315RedisArray *
297- ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , zend_bool b_pconnect , long retry_interval , zend_bool b_lazy_connect TSRMLS_DC ) {
316+ ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , zend_bool b_pconnect , long retry_interval , zend_bool b_lazy_connect , double connect_timeout TSRMLS_DC ) {
298317
299318 int count = zend_hash_num_elements (hosts );
300319
@@ -309,14 +328,15 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
309328 ra -> index = b_index ;
310329 ra -> auto_rehash = 0 ;
311330 ra -> pconnect = b_pconnect ;
331+ ra -> connect_timeout = connect_timeout ;
312332
313333 /* init array data structures */
314334 ra_init_function_table (ra );
315335
316336 if (NULL == ra_load_hosts (ra , hosts , retry_interval , b_lazy_connect TSRMLS_CC )) {
317337 return NULL ;
318338 }
319- ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , b_pconnect , retry_interval , b_lazy_connect TSRMLS_CC ) : NULL ;
339+ ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , b_pconnect , retry_interval , b_lazy_connect , connect_timeout TSRMLS_CC ) : NULL ;
320340
321341 /* copy function if provided */
322342 if (z_fun ) {
0 commit comments