@@ -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 */
@@ -258,18 +260,34 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
258260 b_pconnect = 1 ;
259261 }
260262 }
261- /* find retry interval option */
263+
264+ /* find lazy connect option */
262265 MAKE_STD_ZVAL (z_params_lazy_connect );
263266 array_init (z_params_lazy_connect );
264267 sapi_module .treat_data (PARSE_STRING , estrdup (INI_STR ("redis.arrays.lazyconnect" )), z_params_lazy_connect TSRMLS_CC );
265268 if (zend_hash_find (Z_ARRVAL_P (z_params_lazy_connect ), name , strlen (name ) + 1 , (void * * ) & z_data_pp ) != FAILURE ) {
266269 if (Z_TYPE_PP (z_data_pp ) == IS_STRING && strncmp (Z_STRVAL_PP (z_data_pp ), "1" , 1 ) == 0 ) {
267- b_lazy_connect = 1 ;
270+ b_lazy_connect = 1 ;
271+ }
272+ }
273+
274+ /* find connect timeout option */
275+ MAKE_STD_ZVAL (z_params_connect_timeout );
276+ array_init (z_params_connect_timeout );
277+ sapi_module .treat_data (PARSE_STRING , estrdup (INI_STR ("redis.arrays.connecttimeout" )), z_params_connect_timeout TSRMLS_CC );
278+ if (zend_hash_find (Z_ARRVAL_P (z_params_connect_timeout ), name , strlen (name ) + 1 , (void * * ) & z_data_pp ) != FAILURE ) {
279+ if (Z_TYPE_PP (z_data_pp ) == IS_DOUBLE || Z_TYPE_PP (z_data_pp ) == IS_STRING ) {
280+ if (Z_TYPE_PP (z_data_pp ) == IS_DOUBLE ) {
281+ d_connect_timeout = Z_DVAL_PP (z_data_pp );
282+ }
283+ else {
284+ d_connect_timeout = atof (Z_STRVAL_PP (z_data_pp ));
285+ }
268286 }
269287 }
270-
288+
271289 /* 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 );
290+ 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 );
273291 ra -> auto_rehash = b_autorehash ;
274292
275293 /* cleanup */
@@ -287,14 +305,16 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
287305 efree (z_params_retry_interval );
288306 zval_dtor (z_params_pconnect );
289307 efree (z_params_pconnect );
308+ zval_dtor (z_params_connect_timeout );
309+ efree (z_params_connect_timeout );
290310 zval_dtor (z_params_lazy_connect );
291311 efree (z_params_lazy_connect );
292312
293313 return ra ;
294314}
295315
296316RedisArray *
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 ) {
317+ 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 ) {
298318
299319 int count = zend_hash_num_elements (hosts );
300320
@@ -309,14 +329,15 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
309329 ra -> index = b_index ;
310330 ra -> auto_rehash = 0 ;
311331 ra -> pconnect = b_pconnect ;
332+ ra -> connect_timeout = connect_timeout ;
312333
313334 /* init array data structures */
314335 ra_init_function_table (ra );
315336
316337 if (NULL == ra_load_hosts (ra , hosts , retry_interval , b_lazy_connect TSRMLS_CC )) {
317338 return NULL ;
318339 }
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 ;
340+ 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 ;
320341
321342 /* copy function if provided */
322343 if (z_fun ) {
0 commit comments