@@ -1037,22 +1037,7 @@ PS_GC_FUNC(redis)
1037
1037
*/
1038
1038
1039
1039
/* Prefix a session key */
1040
- static char * cluster_session_key (redisCluster * c , const char * key , int keylen ,
1041
- int * skeylen , short * slot ) {
1042
- char * skey ;
1043
-
1044
- * skeylen = keylen + ZSTR_LEN (c -> flags -> prefix );
1045
- skey = emalloc (* skeylen );
1046
- memcpy (skey , ZSTR_VAL (c -> flags -> prefix ), ZSTR_LEN (c -> flags -> prefix ));
1047
- memcpy (skey + ZSTR_LEN (c -> flags -> prefix ), key , keylen );
1048
-
1049
- * slot = cluster_hash_key (skey , * skeylen );
1050
-
1051
- return skey ;
1052
- }
1053
-
1054
- /* Prefix a session key */
1055
- static zend_string * cluster_session_key_new (redisCluster * c , const char * key , int keylen ,
1040
+ static zend_string * cluster_session_key (redisCluster * c , const char * key , int keylen ,
1056
1041
short * slot ) {
1057
1042
zend_string * session ;
1058
1043
int skeylen ;
@@ -1067,6 +1052,22 @@ static zend_string *cluster_session_key_new(redisCluster *c, const char *key, in
1067
1052
return session ;
1068
1053
}
1069
1054
1055
+ /* Prefix a session key */
1056
+ static void * set_cluster_session_key (redis_cluster_session * sc , const char * key , int keylen ) {
1057
+ int skeylen ;
1058
+ redisCluster * c = sc -> c ;
1059
+
1060
+ if (sc -> lock_status .session_key ) {
1061
+ zend_string_release (sc -> lock_status .session_key );
1062
+ }
1063
+ skeylen = keylen + ZSTR_LEN (c -> flags -> prefix );
1064
+ sc -> lock_status .session_key = zend_string_alloc (skeylen , 0 );
1065
+ memcpy (ZSTR_VAL (sc -> lock_status .session_key ), ZSTR_VAL (c -> flags -> prefix ), ZSTR_LEN (c -> flags -> prefix ));
1066
+ memcpy (ZSTR_VAL (sc -> lock_status .session_key ) + ZSTR_LEN (c -> flags -> prefix ), key , keylen );
1067
+
1068
+ sc -> slot = cluster_hash_key (ZSTR_VAL (sc -> lock_status .session_key ), skeylen );
1069
+ }
1070
+
1070
1071
PS_OPEN_FUNC (rediscluster ) {
1071
1072
redis_cluster_session * sc ;
1072
1073
redisCluster * c ;
@@ -1187,11 +1188,12 @@ PS_OPEN_FUNC(rediscluster) {
1187
1188
*/
1188
1189
PS_CREATE_SID_FUNC (rediscluster )
1189
1190
{
1190
- redisCluster * c = PS_GET_MOD_DATA ();
1191
+ redis_cluster_session * sc = PS_GET_MOD_DATA ();
1192
+ redisCluster * c = sc -> c ;
1191
1193
clusterReply * reply ;
1192
- char * cmd , * skey ;
1193
- zend_string * sid ;
1194
- int cmdlen , skeylen ;
1194
+ char * cmd ;
1195
+ zend_string * sid , * skey ;
1196
+ int cmdlen ;
1195
1197
int retries = 3 ;
1196
1198
short slot ;
1197
1199
@@ -1207,11 +1209,11 @@ PS_CREATE_SID_FUNC(rediscluster)
1207
1209
sid = php_session_create_id ((void * * ) & c );
1208
1210
1209
1211
/* Create session key if it doesn't already exist */
1210
- skey = cluster_session_key (c , ZSTR_VAL (sid ), ZSTR_LEN (sid ), & skeylen , & slot );
1211
- cmdlen = redis_spprintf (NULL , NULL , & cmd , "SET" , "ssssd " , skey ,
1212
- skeylen , "" , 0 , "NX" , 2 , "EX" , 2 , session_gc_maxlifetime ());
1212
+ skey = cluster_session_key (c , ZSTR_VAL (sid ), ZSTR_LEN (sid ), & slot );
1213
+ cmdlen = redis_spprintf (NULL , NULL , & cmd , "SET" , "Ssssd " , skey ,
1214
+ "" , 0 , "NX" , 2 , "EX" , 2 , session_gc_maxlifetime ());
1213
1215
1214
- efree (skey );
1216
+ zend_string_release (skey );
1215
1217
1216
1218
/* Attempt to kick off our command */
1217
1219
c -> readonly = 0 ;
@@ -1252,10 +1254,12 @@ PS_CREATE_SID_FUNC(rediscluster)
1252
1254
*/
1253
1255
PS_VALIDATE_SID_FUNC (rediscluster )
1254
1256
{
1255
- redisCluster * c = PS_GET_MOD_DATA ();
1257
+ redis_cluster_session * sc = PS_GET_MOD_DATA ();
1258
+ redisCluster * c = sc -> c ;
1256
1259
clusterReply * reply ;
1257
- char * cmd , * skey ;
1258
- int cmdlen , skeylen ;
1260
+ char * cmd ;
1261
+ zend_string * skey ;
1262
+ int cmdlen ;
1259
1263
int res = FAILURE ;
1260
1264
short slot ;
1261
1265
@@ -1265,9 +1269,9 @@ PS_VALIDATE_SID_FUNC(rediscluster)
1265
1269
return FAILURE ;
1266
1270
}
1267
1271
1268
- skey = cluster_session_key (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & skeylen , & slot );
1269
- cmdlen = redis_spprintf (NULL , NULL , & cmd , "EXISTS" , "s " , skey , skeylen );
1270
- efree (skey );
1272
+ skey = cluster_session_key (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & slot );
1273
+ cmdlen = redis_spprintf (NULL , NULL , & cmd , "EXISTS" , "S " , skey );
1274
+ zend_string_release (skey );
1271
1275
1272
1276
/* We send to master, to ensure consistency */
1273
1277
c -> readonly = 0 ;
@@ -1301,26 +1305,25 @@ PS_VALIDATE_SID_FUNC(rediscluster)
1301
1305
/* {{{ PS_UPDATE_TIMESTAMP_FUNC
1302
1306
*/
1303
1307
PS_UPDATE_TIMESTAMP_FUNC (rediscluster ) {
1304
- redisCluster * c = PS_GET_MOD_DATA ();
1308
+ redis_cluster_session * sc = PS_GET_MOD_DATA ();
1309
+ redisCluster * c = sc -> c ;
1305
1310
clusterReply * reply ;
1306
- char * cmd , * skey ;
1307
- int cmdlen , skeylen ;
1308
- short slot ;
1311
+ char * cmd ;
1312
+ int cmdlen ;
1309
1313
1310
1314
/* No need to update the session timestamp if we've already done so */
1311
1315
if (INI_INT ("redis.session.early_refresh" )) {
1312
1316
return SUCCESS ;
1313
1317
}
1314
1318
1315
1319
/* Set up command and slot info */
1316
- skey = cluster_session_key (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & skeylen , & slot );
1317
- cmdlen = redis_spprintf (NULL , NULL , & cmd , "EXPIRE" , "sd" , skey ,
1318
- skeylen , session_gc_maxlifetime ());
1319
- efree (skey );
1320
+ set_cluster_session_key (sc , ZSTR_VAL (key ), ZSTR_LEN (key ));
1321
+ cmdlen = redis_spprintf (NULL , NULL , & cmd , "EXPIRE" , "Sd" , sc -> lock_status .session_key ,
1322
+ session_gc_maxlifetime ());
1320
1323
1321
1324
/* Attempt to send EXPIRE command */
1322
1325
c -> readonly = 0 ;
1323
- if (cluster_send_command (c ,slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1326
+ if (cluster_send_command (c ,sc -> slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1324
1327
php_error_docref (NULL , E_NOTICE , "Redis unable to update session expiry" );
1325
1328
efree (cmd );
1326
1329
return FAILURE ;
@@ -1354,9 +1357,7 @@ PS_READ_FUNC(rediscluster) {
1354
1357
short slot ;
1355
1358
1356
1359
/* Set up our command and slot information */
1357
- if (sc -> lock_status .session_key ) zend_string_release (sc -> lock_status .session_key );
1358
- sc -> lock_status .session_key = cluster_session_key_new (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & slot );
1359
- sc -> slot = slot ;
1360
+ set_cluster_session_key (sc , ZSTR_VAL (key ), ZSTR_LEN (key ));
1360
1361
1361
1362
/* Update the session ttl if early refresh is enabled */
1362
1363
if (INI_INT ("redis.session.early_refresh" )) {
@@ -1375,7 +1376,7 @@ PS_READ_FUNC(rediscluster) {
1375
1376
}
1376
1377
1377
1378
/* Attempt to kick off our command */
1378
- if (cluster_send_command (c ,slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1379
+ if (cluster_send_command (c ,sc -> slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1379
1380
efree (cmd );
1380
1381
return FAILURE ;
1381
1382
}
@@ -1453,13 +1454,12 @@ PS_DESTROY_FUNC(rediscluster) {
1453
1454
clusterReply * reply ;
1454
1455
char * cmd ;
1455
1456
int cmdlen ;
1456
- short slot ;
1457
1457
1458
1458
/* Set up command and slot info */
1459
1459
cmdlen = redis_spprintf (NULL , NULL , & cmd , "DEL" , "S" , sc -> lock_status .session_key );
1460
1460
1461
1461
/* Attempt to send command */
1462
- if (cluster_send_command (c ,slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1462
+ if (cluster_send_command (c ,sc -> slot ,cmd ,cmdlen ) < 0 || c -> err ) {
1463
1463
efree (cmd );
1464
1464
return FAILURE ;
1465
1465
}
0 commit comments