@@ -36,7 +36,7 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval TSRMLS_DC)
36
36
int count = zend_hash_num_elements (hosts );
37
37
char * host , * p ;
38
38
short port ;
39
- zval * * zpData , z_cons , z_ret ;
39
+ zval * * zpData , * z_args , z_cons , z_ret ;
40
40
RedisSock * redis_sock = NULL ;
41
41
42
42
/* function calls on the Redis object */
@@ -59,7 +59,9 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval TSRMLS_DC)
59
59
if ((p = strchr (host , ':' ))) { /* found port */
60
60
host_len = p - host ;
61
61
port = (short )atoi (p + 1 );
62
- }
62
+ } else if (strchr (host ,'/' ) != NULL ) { /* unix socket */
63
+ port = -1 ;
64
+ }
63
65
64
66
/* create Redis object */
65
67
MAKE_STD_ZVAL (ra -> redis [i ]);
@@ -68,7 +70,7 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval TSRMLS_DC)
68
70
call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_cons , & z_ret , 0 , NULL TSRMLS_CC );
69
71
70
72
/* create socket */
71
- redis_sock = redis_sock_create (host , host_len , port , 0 , 0 , NULL , retry_interval ); /* TODO: persistence? */
73
+ redis_sock = redis_sock_create (host , host_len , port , 0 , ra -> pconnect , NULL , retry_interval );
72
74
73
75
/* connect */
74
76
redis_sock_server_open (redis_sock , 1 TSRMLS_CC );
@@ -160,9 +162,10 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
160
162
zval * z_params_index ;
161
163
zval * z_params_autorehash ;
162
164
zval * z_params_retry_interval ;
165
+ zval * z_params_pconnect ;
163
166
RedisArray * ra = NULL ;
164
167
165
- zend_bool b_index = 0 , b_autorehash = 0 ;
168
+ zend_bool b_index = 0 , b_autorehash = 0 , b_pconnect = 0 ;
166
169
long l_retry_interval = 0 ;
167
170
HashTable * hHosts = NULL , * hPrev = NULL ;
168
171
@@ -241,8 +244,18 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
241
244
}
242
245
}
243
246
247
+ /* find pconnect option */
248
+ MAKE_STD_ZVAL (z_params_pconnect );
249
+ array_init (z_params_pconnect );
250
+ sapi_module .treat_data (PARSE_STRING , estrdup (INI_STR ("redis.arrays.pconnect" )), z_params_pconnect TSRMLS_CC );
251
+ if (zend_hash_find (Z_ARRVAL_P (z_params_pconnect ), name , strlen (name ) + 1 , (void * * ) & z_data_pp ) != FAILURE ) {
252
+ if (Z_TYPE_PP (z_data_pp ) == IS_STRING && strncmp (Z_STRVAL_PP (z_data_pp ), "1" , 1 ) == 0 ) {
253
+ b_pconnect = 1 ;
254
+ }
255
+ }
256
+
244
257
/* create RedisArray object */
245
- ra = ra_make_array (hHosts , z_fun , z_dist , hPrev , b_index , l_retry_interval TSRMLS_CC );
258
+ ra = ra_make_array (hHosts , z_fun , z_dist , hPrev , b_index , l_retry_interval , b_pconnect TSRMLS_CC );
246
259
ra -> auto_rehash = b_autorehash ;
247
260
248
261
/* cleanup */
@@ -258,12 +271,14 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
258
271
efree (z_params_autorehash );
259
272
zval_dtor (z_params_retry_interval );
260
273
efree (z_params_retry_interval );
274
+ zval_dtor (z_params_pconnect );
275
+ efree (z_params_pconnect );
261
276
262
277
return ra ;
263
278
}
264
279
265
280
RedisArray *
266
- ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , long retry_interval TSRMLS_DC ) {
281
+ ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , long retry_interval , zend_bool b_pconnect TSRMLS_DC ) {
267
282
268
283
int count = zend_hash_num_elements (hosts );
269
284
@@ -284,7 +299,7 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
284
299
if (NULL == ra_load_hosts (ra , hosts , retry_interval TSRMLS_CC )) {
285
300
return NULL ;
286
301
}
287
- ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , retry_interval TSRMLS_CC ) : NULL ;
302
+ ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , retry_interval , b_pconnect TSRMLS_CC ) : NULL ;
288
303
289
304
/* copy function if provided */
290
305
if (z_fun ) {
0 commit comments