Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2019-02-22 10:42:50 +0300
committermichael-grunder <michael.grunder@gmail.com>2019-03-19 23:05:41 +0300
commit675d1277006a3349a45bd22d8ba7abfced460e07 (patch)
tree1a7adb2d2333bb4599cd3caba3f6fbad812a3259 /library.c
parentc6519dda47ed29f7130959d3ed7c74ff11e6ec62 (diff)
Refactor connection pooling code.
Move logic of searching+creating connection pool resource to `redis_sock_get_connection_pool`. Don't close streams in ZEND_RSRC_DTOR_FUNC because all of them stored in `EG(persistent_list)` and will be destroyed by PHP engine.
Diffstat (limited to 'library.c')
-rw-r--r--library.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/library.c b/library.c
index dfc6a876..a390845b 100644
--- a/library.c
+++ b/library.c
@@ -45,6 +45,23 @@ extern zend_class_entry *redis_exception_ce;
extern int le_redis_pconnect;
+static zend_llist *
+redis_sock_get_connection_pool(RedisSock *redis_sock)
+{
+ zend_string *persistent_id = strpprintf(0, "phpredis_%s:%d", ZSTR_VAL(redis_sock->host), redis_sock->port);
+ zend_resource *le = zend_hash_find_ptr(&EG(persistent_list), persistent_id);
+ if (!le) {
+ zend_llist *list = pecalloc(1, sizeof(*list) + sizeof(*le), 1);
+ zend_llist_init(list, sizeof(php_stream *), NULL, 1);
+ le = (zend_resource *)((char *)list + sizeof(*list));
+ le->type = le_redis_pconnect;
+ le->ptr = list;
+ zend_hash_str_update_mem(&EG(persistent_list), ZSTR_VAL(persistent_id), ZSTR_LEN(persistent_id), le, sizeof(*le));
+ }
+ zend_string_release(persistent_id);
+ return le->ptr;
+}
+
/* Helper to reselect the proper DB number when we reconnect */
static int reselect_db(RedisSock *redis_sock TSRMLS_DC) {
char *cmd, *response;
@@ -1701,20 +1718,17 @@ PHP_REDIS_API int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC)
if (redis_sock->persistent) {
if (INI_INT("redis.pconnect.pooling_enabled")) {
- persistent_id = strpprintf(0, "phpredis_%s:%d", ZSTR_VAL(redis_sock->host), redis_sock->port);
- zend_resource *le = zend_hash_find_ptr(&EG(persistent_list), persistent_id);
- if (le && zend_llist_count(le->ptr) > 0) {
- redis_sock->stream = *(php_stream **)zend_llist_get_last(le->ptr);
- zend_llist_remove_tail(le->ptr);
+ zend_llist *list = redis_sock_get_connection_pool(redis_sock);
+ if (zend_llist_count(list) > 0) {
+ redis_sock->stream = *(php_stream **)zend_llist_get_last(list);
+ zend_llist_remove_tail(list);
/* Check socket liveness using 0 second timeout */
if (php_stream_set_option(redis_sock->stream, PHP_STREAM_OPTION_CHECK_LIVENESS, 0, NULL) == PHP_STREAM_OPTION_RETURN_OK) {
redis_sock->status = REDIS_SOCK_STATUS_CONNECTED;
- zend_string_release(persistent_id);
return SUCCESS;
}
php_stream_pclose(redis_sock->stream);
}
- zend_string_release(persistent_id);
gettimeofday(&tv, NULL);
persistent_id = strpprintf(0, "phpredis_%d%d", tv.tv_sec, tv.tv_usec);
@@ -1808,18 +1822,8 @@ redis_sock_disconnect(RedisSock *redis_sock, int force TSRMLS_DC)
if (force) {
php_stream_pclose(redis_sock->stream);
} else if (INI_INT("redis.pconnect.pooling_enabled")) {
- zend_string *persistent_id = strpprintf(0, "phpredis_%s:%d", ZSTR_VAL(redis_sock->host), redis_sock->port);
- zend_resource *le = zend_hash_find_ptr(&EG(persistent_list), persistent_id);
- if (!le) {
- zend_llist *l = pecalloc(1, sizeof(*l) + sizeof(*le), 1);
- zend_llist_init(l, sizeof(php_stream *), NULL, 1);
- le = (zend_resource *)((char *)l + sizeof(*l));
- le->type = le_redis_pconnect;
- le->ptr = l;
- zend_hash_str_update_mem(&EG(persistent_list), ZSTR_VAL(persistent_id), ZSTR_LEN(persistent_id), le, sizeof(*le));
- }
- zend_llist_prepend_element(le->ptr, &redis_sock->stream);
- zend_string_release(persistent_id);
+ zend_llist *list = redis_sock_get_connection_pool(redis_sock);
+ zend_llist_prepend_element(list, &redis_sock->stream);
}
} else {
php_stream_close(redis_sock->stream);