Skip to content

Commit 5213ee5

Browse files
authored
Merge pull request phpredis#1319 from yatsukhnenko/session-locking
Refactor redis session
2 parents 5a3f762 + 65fffad commit 5213ee5

File tree

1 file changed

+33
-48
lines changed

1 file changed

+33
-48
lines changed

redis_session.c

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,8 @@ typedef struct redis_pool_member_ {
8181
int weight;
8282
int database;
8383

84-
char *prefix;
85-
size_t prefix_len;
86-
87-
char *auth;
88-
size_t auth_len;
84+
zend_string *auth;
85+
zend_string *prefix;
8986

9087
struct redis_pool_member_ *next;
9188

@@ -97,34 +94,22 @@ typedef struct {
9794
int count;
9895

9996
redis_pool_member *head;
100-
redis_session_lock_status *lock_status;
97+
redis_session_lock_status lock_status;
10198

10299
} redis_pool;
103100

104-
PHP_REDIS_API redis_pool*
105-
redis_pool_new(TSRMLS_D) {
106-
redis_pool *pool;
107-
108-
pool = ecalloc(1, sizeof(*pool));
109-
pool->lock_status = ecalloc(1, sizeof(*pool->lock_status));
110-
111-
return pool;
112-
}
113101

114102
PHP_REDIS_API void
115103
redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight,
116-
int database, char *prefix, char *auth TSRMLS_DC) {
104+
int database, zend_string *prefix, zend_string *auth TSRMLS_DC) {
117105

118106
redis_pool_member *rpm = ecalloc(1, sizeof(redis_pool_member));
119107
rpm->redis_sock = redis_sock;
120108
rpm->weight = weight;
121109
rpm->database = database;
122110

123111
rpm->prefix = prefix;
124-
rpm->prefix_len = (prefix?strlen(prefix):0);
125-
126112
rpm->auth = auth;
127-
rpm->auth_len = (auth?strlen(auth):0);
128113

129114
rpm->next = pool->head;
130115
pool->head = rpm;
@@ -141,22 +126,21 @@ redis_pool_free(redis_pool *pool TSRMLS_DC) {
141126
next = rpm->next;
142127
redis_sock_disconnect(rpm->redis_sock TSRMLS_CC);
143128
redis_free_socket(rpm->redis_sock);
144-
if(rpm->prefix) efree(rpm->prefix);
145-
if(rpm->auth) efree(rpm->auth);
129+
if (rpm->prefix) zend_string_release(rpm->prefix);
130+
if (rpm->auth) zend_string_release(rpm->auth);
146131
efree(rpm);
147132
rpm = next;
148133
}
149134

150135
/* Cleanup after our lock */
151-
if (pool->lock_status->session_key)
152-
efree(pool->lock_status->session_key);
153-
if (pool->lock_status->lock_secret)
154-
efree(pool->lock_status->lock_secret);
155-
if (pool->lock_status->lock_key)
156-
efree(pool->lock_status->lock_key);
157-
158-
/* Cleanup lock status struct and pool itself */
159-
efree(pool->lock_status);
136+
if (pool->lock_status.session_key)
137+
efree(pool->lock_status.session_key);
138+
if (pool->lock_status.lock_secret)
139+
efree(pool->lock_status.lock_secret);
140+
if (pool->lock_status.lock_key)
141+
efree(pool->lock_status.lock_key);
142+
143+
/* Cleanup pool itself */
160144
efree(pool);
161145
}
162146

@@ -183,11 +167,11 @@ redis_pool_member_auth(redis_pool_member *rpm TSRMLS_DC) {
183167
int response_len, cmd_len;
184168

185169
/* Short circuit if we don't have a password */
186-
if(!rpm->auth || !rpm->auth_len) {
170+
if (!rpm->auth) {
187171
return;
188172
}
189173

190-
cmd_len = REDIS_SPPRINTF(&cmd, "AUTH", "s", rpm->auth, rpm->auth_len);
174+
cmd_len = REDIS_SPPRINTF(&cmd, "AUTH", "S", rpm->auth);
191175
if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) >= 0) {
192176
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC))) {
193177
efree(response);
@@ -223,7 +207,7 @@ redis_pool_get_sock(redis_pool *pool, const char *key TSRMLS_DC) {
223207
for(i = 0; i < pool->totalWeight;) {
224208
if(pos >= i && pos < i + rpm->weight) {
225209
int needs_auth = 0;
226-
if(rpm->auth && rpm->auth_len && rpm->redis_sock->status != REDIS_SOCK_STATUS_CONNECTED) {
210+
if (rpm->auth && rpm->redis_sock->status != REDIS_SOCK_STATUS_CONNECTED) {
227211
needs_auth = 1;
228212
}
229213
redis_sock_server_open(rpm->redis_sock TSRMLS_CC);
@@ -427,7 +411,7 @@ PS_OPEN_FUNC(redis)
427411
zval params, *param;
428412
int i, j, path_len;
429413

430-
redis_pool *pool = redis_pool_new(TSRMLS_C);
414+
redis_pool *pool = ecalloc(1, sizeof(*pool));
431415

432416
for (i=0,j=0,path_len=strlen(save_path); i<path_len; i=j+1) {
433417
/* find beginning of url */
@@ -444,8 +428,9 @@ PS_OPEN_FUNC(redis)
444428
double timeout = 86400.0, read_timeout = 0.0;
445429
int persistent = 0;
446430
int database = -1;
447-
char *prefix = NULL, *auth = NULL, *persistent_id = NULL;
431+
char *persistent_id = NULL;
448432
long retry_interval = 0;
433+
zend_string *prefix = NULL, *auth = NULL;
449434

450435
/* translate unix: into file: */
451436
if (!strncmp(save_path+i, "unix:", sizeof("unix:")-1)) {
@@ -491,10 +476,10 @@ PS_OPEN_FUNC(redis)
491476
persistent_id = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
492477
}
493478
if ((param = zend_hash_str_find(Z_ARRVAL(params), "prefix", sizeof("prefix") - 1)) != NULL) {
494-
prefix = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
479+
prefix = zval_get_string(param);
495480
}
496481
if ((param = zend_hash_str_find(Z_ARRVAL(params), "auth", sizeof("auth") - 1)) != NULL) {
497-
auth = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
482+
auth = zval_get_string(param);
498483
}
499484
if ((param = zend_hash_str_find(Z_ARRVAL(params), "database", sizeof("database") - 1)) != NULL) {
500485
database = zval_get_long(param);
@@ -509,8 +494,8 @@ PS_OPEN_FUNC(redis)
509494
if ((url->path == NULL && url->host == NULL) || weight <= 0 || timeout <= 0) {
510495
php_url_free(url);
511496
if (persistent_id) efree(persistent_id);
512-
if (prefix) efree(prefix);
513-
if (auth) efree(auth);
497+
if (prefix) zend_string_release(prefix);
498+
if (auth) zend_string_release(auth);
514499
redis_pool_free(pool TSRMLS_CC);
515500
PS_SET_MOD_DATA(NULL);
516501
return FAILURE;
@@ -544,11 +529,11 @@ PS_CLOSE_FUNC(redis)
544529
redis_pool *pool = PS_GET_MOD_DATA();
545530

546531
if(pool){
547-
redis_pool_member *rpm = redis_pool_get_sock(pool, pool->lock_status->session_key TSRMLS_CC);
532+
redis_pool_member *rpm = redis_pool_get_sock(pool, pool->lock_status.session_key TSRMLS_CC);
548533

549534
RedisSock *redis_sock = rpm ? rpm->redis_sock : NULL;
550535
if (redis_sock) {
551-
lock_release(redis_sock, pool->lock_status TSRMLS_CC);
536+
lock_release(redis_sock, &pool->lock_status TSRMLS_CC);
552537
}
553538

554539
redis_pool_free(pool TSRMLS_CC);
@@ -567,9 +552,9 @@ redis_session_key(redis_pool_member *rpm, const char *key, int key_len, int *ses
567552
char *prefix = default_prefix;
568553
size_t prefix_len = sizeof(default_prefix)-1;
569554

570-
if(rpm->prefix) {
571-
prefix = rpm->prefix;
572-
prefix_len = rpm->prefix_len;
555+
if (rpm->prefix) {
556+
prefix = ZSTR_VAL(rpm->prefix);
557+
prefix_len = ZSTR_LEN(rpm->prefix);
573558
}
574559

575560
/* build session key */
@@ -605,12 +590,12 @@ PS_READ_FUNC(redis)
605590
#else
606591
resp = redis_session_key(rpm, ZSTR_VAL(key), ZSTR_LEN(key), &resp_len);
607592
#endif
608-
pool->lock_status->session_key = estrndup(resp, resp_len);
593+
pool->lock_status.session_key = estrndup(resp, resp_len);
609594

610595
cmd_len = REDIS_SPPRINTF(&cmd, "GET", "s", resp, resp_len);
611596
efree(resp);
612597

613-
if (lock_acquire(redis_sock, pool->lock_status TSRMLS_CC) != SUCCESS) {
598+
if (lock_acquire(redis_sock, &pool->lock_status TSRMLS_CC) != SUCCESS) {
614599
php_error_docref(NULL TSRMLS_CC, E_NOTICE,
615600
"Acquire of session lock was not successful");
616601
}
@@ -679,7 +664,7 @@ PS_WRITE_FUNC(redis)
679664
#endif
680665
efree(session);
681666

682-
if(!write_allowed(redis_sock, pool->lock_status TSRMLS_CC) || redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
667+
if (!write_allowed(redis_sock, &pool->lock_status TSRMLS_CC) || redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
683668
efree(cmd);
684669
return FAILURE;
685670
}
@@ -720,7 +705,7 @@ PS_DESTROY_FUNC(redis)
720705

721706
/* Release lock */
722707
if (redis_sock) {
723-
lock_release(redis_sock, pool->lock_status TSRMLS_CC);
708+
lock_release(redis_sock, &pool->lock_status TSRMLS_CC);
724709
}
725710

726711
/* send DEL command */

0 commit comments

Comments
 (0)