Skip to content

Commit 6e00f22

Browse files
authored
Merge pull request phpredis#1281 from yatsukhnenko/develop
Refactor redis session
2 parents 4cf3414 + 485db46 commit 6e00f22

File tree

1 file changed

+45
-53
lines changed

1 file changed

+45
-53
lines changed

redis_session.c

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,8 @@ typedef struct redis_pool_member_ {
5353
RedisSock *redis_sock;
5454
int weight;
5555
int database;
56-
57-
char *prefix;
58-
size_t prefix_len;
59-
60-
char *auth;
61-
size_t auth_len;
62-
56+
zend_string *prefix;
57+
zend_string *auth;
6358
struct redis_pool_member_ *next;
6459

6560
} redis_pool_member;
@@ -80,18 +75,16 @@ redis_pool_new(TSRMLS_D) {
8075

8176
PHP_REDIS_API void
8277
redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight,
83-
int database, char *prefix, char *auth TSRMLS_DC) {
78+
int database, zend_string *prefix, zend_string *auth TSRMLS_DC) {
8479

8580
redis_pool_member *rpm = ecalloc(1, sizeof(redis_pool_member));
8681
rpm->redis_sock = redis_sock;
8782
rpm->weight = weight;
8883
rpm->database = database;
8984

9085
rpm->prefix = prefix;
91-
rpm->prefix_len = (prefix?strlen(prefix):0);
9286

9387
rpm->auth = auth;
94-
rpm->auth_len = (auth?strlen(auth):0);
9588

9689
rpm->next = pool->head;
9790
pool->head = rpm;
@@ -108,8 +101,8 @@ redis_pool_free(redis_pool *pool TSRMLS_DC) {
108101
next = rpm->next;
109102
redis_sock_disconnect(rpm->redis_sock TSRMLS_CC);
110103
redis_free_socket(rpm->redis_sock);
111-
if(rpm->prefix) efree(rpm->prefix);
112-
if(rpm->auth) efree(rpm->auth);
104+
if(rpm->prefix) zend_string_release(rpm->prefix);
105+
if(rpm->auth) zend_string_release(rpm->auth);
113106
efree(rpm);
114107
rpm = next;
115108
}
@@ -123,11 +116,11 @@ redis_pool_member_auth(redis_pool_member *rpm TSRMLS_DC) {
123116
int response_len, cmd_len;
124117

125118
/* Short circuit if we don't have a password */
126-
if(!rpm->auth || !rpm->auth_len) {
119+
if (!rpm->auth) {
127120
return;
128121
}
129122

130-
cmd_len = REDIS_SPPRINTF(&cmd, "AUTH", "s", rpm->auth, rpm->auth_len);
123+
cmd_len = REDIS_SPPRINTF(&cmd, "AUTH", "S", rpm->auth);
131124
if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) >= 0) {
132125
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC))) {
133126
efree(response);
@@ -163,7 +156,7 @@ redis_pool_get_sock(redis_pool *pool, const char *key TSRMLS_DC) {
163156
for(i = 0; i < pool->totalWeight;) {
164157
if(pos >= i && pos < i + rpm->weight) {
165158
int needs_auth = 0;
166-
if(rpm->auth && rpm->auth_len && rpm->redis_sock->status != REDIS_SOCK_STATUS_CONNECTED) {
159+
if (rpm->auth && rpm->redis_sock->status != REDIS_SOCK_STATUS_CONNECTED) {
167160
needs_auth = 1;
168161
}
169162
redis_sock_server_open(rpm->redis_sock TSRMLS_CC);
@@ -208,7 +201,8 @@ PS_OPEN_FUNC(redis)
208201
double timeout = 86400.0, read_timeout = 0.0;
209202
int persistent = 0;
210203
int database = -1;
211-
char *prefix = NULL, *auth = NULL, *persistent_id = NULL;
204+
char *persistent_id = NULL;
205+
zend_string *prefix = NULL, *auth = NULL;
212206
long retry_interval = 0;
213207

214208
/* translate unix: into file: */
@@ -255,10 +249,10 @@ PS_OPEN_FUNC(redis)
255249
persistent_id = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
256250
}
257251
if ((param = zend_hash_str_find(Z_ARRVAL(params), "prefix", sizeof("prefix") - 1)) != NULL) {
258-
prefix = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
252+
prefix = zend_string_init(Z_STRVAL_P(param), Z_STRLEN_P(param), 0);
259253
}
260254
if ((param = zend_hash_str_find(Z_ARRVAL(params), "auth", sizeof("auth") - 1)) != NULL) {
261-
auth = estrndup(Z_STRVAL_P(param), Z_STRLEN_P(param));
255+
auth = zend_string_init(Z_STRVAL_P(param), Z_STRLEN_P(param), 0);
262256
}
263257
if ((param = zend_hash_str_find(Z_ARRVAL(params), "database", sizeof("database") - 1)) != NULL) {
264258
database = zval_get_long(param);
@@ -273,8 +267,8 @@ PS_OPEN_FUNC(redis)
273267
if ((url->path == NULL && url->host == NULL) || weight <= 0 || timeout <= 0) {
274268
php_url_free(url);
275269
if (persistent_id) efree(persistent_id);
276-
if (prefix) efree(prefix);
277-
if (auth) efree(auth);
270+
if (prefix) zend_string_release(prefix);
271+
if (auth) zend_string_release(auth);
278272
redis_pool_free(pool TSRMLS_CC);
279273
PS_SET_MOD_DATA(NULL);
280274
return FAILURE;
@@ -324,8 +318,8 @@ redis_session_key(redis_pool_member *rpm, const char *key, int key_len, int *ses
324318
size_t prefix_len = sizeof(default_prefix)-1;
325319

326320
if(rpm->prefix) {
327-
prefix = rpm->prefix;
328-
prefix_len = rpm->prefix_len;
321+
prefix = ZSTR_VAL(rpm->prefix);
322+
prefix_len = ZSTR_LEN(rpm->prefix);
329323
}
330324

331325
/* build session key */
@@ -343,24 +337,25 @@ PS_READ_FUNC(redis)
343337
{
344338
char *resp, *cmd;
345339
int resp_len, cmd_len;
346-
347-
redis_pool *pool = PS_GET_MOD_DATA();
348340
#if (PHP_MAJOR_VERSION < 7)
349-
redis_pool_member *rpm = redis_pool_get_sock(pool, key TSRMLS_CC);
341+
const char *skey = key;
342+
size_t skeylen = strlen(key);
350343
#else
351-
redis_pool_member *rpm = redis_pool_get_sock(pool, ZSTR_VAL(key) TSRMLS_CC);
344+
const char *skey = ZSTR_VAL(key);
345+
size_t skeylen = ZSTR_LEN(key);
352346
#endif
347+
348+
if (!skeylen) return FAILURE;
349+
350+
redis_pool *pool = PS_GET_MOD_DATA();
351+
redis_pool_member *rpm = redis_pool_get_sock(pool, skey TSRMLS_CC);
353352
RedisSock *redis_sock = rpm?rpm->redis_sock:NULL;
354353
if(!rpm || !redis_sock){
355354
return FAILURE;
356355
}
357356

358357
/* send GET command */
359-
#if (PHP_MAJOR_VERSION < 7)
360-
resp = redis_session_key(rpm, key, strlen(key), &resp_len);
361-
#else
362-
resp = redis_session_key(rpm, ZSTR_VAL(key), ZSTR_LEN(key), &resp_len);
363-
#endif
358+
resp = redis_session_key(rpm, skey, skeylen, &resp_len);
364359
cmd_len = REDIS_SPPRINTF(&cmd, "GET", "s", resp, resp_len);
365360

366361
efree(resp);
@@ -403,29 +398,27 @@ PS_WRITE_FUNC(redis)
403398
{
404399
char *cmd, *response, *session;
405400
int cmd_len, response_len, session_len;
406-
407-
redis_pool *pool = PS_GET_MOD_DATA();
408401
#if (PHP_MAJOR_VERSION < 7)
409-
redis_pool_member *rpm = redis_pool_get_sock(pool, key TSRMLS_CC);
402+
const char *skey = key, *sval = val;
403+
size_t skeylen = strlen(key), svallen = vallen;
410404
#else
411-
redis_pool_member *rpm = redis_pool_get_sock(pool, ZSTR_VAL(key) TSRMLS_CC);
405+
const char *skey = ZSTR_VAL(key), *sval = ZSTR_VAL(val);
406+
size_t skeylen = ZSTR_LEN(key), svallen = ZSTR_LEN(val);
412407
#endif
408+
409+
if (!skeylen) return FAILURE;
410+
411+
redis_pool *pool = PS_GET_MOD_DATA();
412+
redis_pool_member *rpm = redis_pool_get_sock(pool, skey TSRMLS_CC);
413413
RedisSock *redis_sock = rpm?rpm->redis_sock:NULL;
414414
if(!rpm || !redis_sock){
415415
return FAILURE;
416416
}
417417

418418
/* send SET command */
419-
#if (PHP_MAJOR_VERSION < 7)
420-
session = redis_session_key(rpm, key, strlen(key), &session_len);
419+
session = redis_session_key(rpm, skey, skeylen, &session_len);
421420
cmd_len = REDIS_SPPRINTF(&cmd, "SETEX", "sds", session, session_len,
422-
INI_INT("session.gc_maxlifetime"), val, vallen);
423-
#else
424-
session = redis_session_key(rpm, ZSTR_VAL(key), ZSTR_LEN(key), &session_len);
425-
cmd_len = REDIS_SPPRINTF(&cmd, "SETEX", "sds", session, session_len,
426-
INI_INT("session.gc_maxlifetime"),
427-
ZSTR_VAL(val), ZSTR_LEN(val));
428-
#endif
421+
INI_INT("session.gc_maxlifetime"), sval, svallen);
429422
efree(session);
430423
if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
431424
efree(cmd);
@@ -454,24 +447,23 @@ PS_DESTROY_FUNC(redis)
454447
{
455448
char *cmd, *response, *session;
456449
int cmd_len, response_len, session_len;
457-
458-
redis_pool *pool = PS_GET_MOD_DATA();
459450
#if (PHP_MAJOR_VERSION < 7)
460-
redis_pool_member *rpm = redis_pool_get_sock(pool, key TSRMLS_CC);
451+
const char *skey = key;
452+
size_t skeylen = strlen(key);
461453
#else
462-
redis_pool_member *rpm = redis_pool_get_sock(pool, ZSTR_VAL(key) TSRMLS_CC);
454+
const char *skey = ZSTR_VAL(key);
455+
size_t skeylen = ZSTR_LEN(key);
463456
#endif
457+
458+
redis_pool *pool = PS_GET_MOD_DATA();
459+
redis_pool_member *rpm = redis_pool_get_sock(pool, skey TSRMLS_CC);
464460
RedisSock *redis_sock = rpm?rpm->redis_sock:NULL;
465461
if(!rpm || !redis_sock){
466462
return FAILURE;
467463
}
468464

469465
/* send DEL command */
470-
#if (PHP_MAJOR_VERSION < 7)
471-
session = redis_session_key(rpm, key, strlen(key), &session_len);
472-
#else
473-
session = redis_session_key(rpm, ZSTR_VAL(key), ZSTR_LEN(key), &session_len);
474-
#endif
466+
session = redis_session_key(rpm, skey, skeylen, &session_len);
475467
cmd_len = REDIS_SPPRINTF(&cmd, "DEL", "s", session, session_len);
476468
efree(session);
477469
if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {

0 commit comments

Comments
 (0)