Minor session compression cleanup.

* We can compress without the need for sepearate buffers.
* Allow both "" and "none" to mean "none" in terms of
  redis.session.compression.
This commit is contained in:
michael-grunder
2024-04-08 14:31:15 -07:00
committed by Michael Grunder
parent dc39bd55a0
commit 2b555c89ef
+21 -21
View File
@@ -142,22 +142,23 @@ static int session_gc_maxlifetime(void) {
/* Retrieve redis.session.compression from php.ini */
static int session_compression_type(void) {
const char *compression = INI_STR("redis.session.compression");
#ifdef HAVE_REDIS_LZF
if(strncasecmp(INI_STR("redis.session.compression"), "lzf", sizeof("lzf") - 1) == 0) {
if(strncasecmp(compression, "lzf", sizeof("lzf") - 1) == 0) {
return REDIS_COMPRESSION_LZF;
}
#endif
#ifdef HAVE_REDIS_ZSTD
if(strncasecmp(INI_STR("redis.session.compression"), "zstd", sizeof("zstd") - 1) == 0) {
if(strncasecmp(compression, "zstd", sizeof("zstd") - 1) == 0) {
return REDIS_COMPRESSION_ZSTD;
}
#endif
#ifdef HAVE_REDIS_LZ4
if(strncasecmp(INI_STR("redis.session.compression"), "lz4", sizeof("lz4") - 1) == 0) {
if(strncasecmp(compression, "lz4", sizeof("lz4") - 1) == 0) {
return REDIS_COMPRESSION_LZ4;
}
#endif
if(strncasecmp(INI_STR("redis.session.compression"), "none", sizeof("none") - 1) == 0) {
if(*compression == '\0' || strncasecmp(compression, "none", sizeof("none") - 1) == 0) {
return REDIS_COMPRESSION_NONE;
}
@@ -185,7 +186,7 @@ session_compress_data(RedisSock *redis_sock, char *data, size_t len,
}
/* Helper to uncompress session data */
static int
static int
session_uncompress_data(RedisSock *redis_sock, char *data, size_t len,
char **decompressed_data, size_t *decompressed_len) {
if (redis_sock->compression) {
@@ -817,10 +818,11 @@ PS_READ_FUNC(redis)
*/
PS_WRITE_FUNC(redis)
{
char *cmd, *response, *compressed_buf = NULL;
int cmd_len, response_len, compressed_free = 0;
const char *skey = ZSTR_VAL(key), *sval = ZSTR_VAL(val);
size_t skeylen = ZSTR_LEN(key), svallen = ZSTR_LEN(val), compressed_len = 0;
char *cmd, *response;
int cmd_len, response_len, compressed_free;
const char *skey = ZSTR_VAL(key);
size_t skeylen = ZSTR_LEN(key), svallen = ZSTR_LEN(val);
char *sval;
if (!skeylen) return FAILURE;
@@ -835,14 +837,13 @@ PS_WRITE_FUNC(redis)
/* send SET command */
zend_string *session = redis_session_key(redis_sock, skey, skeylen);
compressed_free = session_compress_data(redis_sock, ZSTR_VAL(val), ZSTR_LEN(val), &compressed_buf, &compressed_len);
sval = compressed_buf;
svallen = compressed_len;
compressed_free = session_compress_data(redis_sock, ZSTR_VAL(val), ZSTR_LEN(val),
&sval, &svallen);
cmd_len = REDIS_SPPRINTF(&cmd, "SETEX", "Sds", session, session_gc_maxlifetime(), sval, svallen);
zend_string_release(session);
if (compressed_free) {
efree(compressed_buf);
efree(sval);
}
if (!write_allowed(redis_sock, &pool->lock_status)) {
@@ -1281,14 +1282,13 @@ PS_READ_FUNC(rediscluster) {
PS_WRITE_FUNC(rediscluster) {
redisCluster *c = PS_GET_MOD_DATA();
clusterReply *reply;
char *cmd, *skey, *compressed_buf = NULL, *sval = ZSTR_VAL(val);
int cmdlen, skeylen, compressed_free = 0, svallen = ZSTR_LEN(val);
char *cmd, *skey, *sval;
int cmdlen, skeylen, compressed_free;
size_t svallen;
short slot;
size_t compressed_len = 0;
compressed_free = session_compress_data(c->flags, sval, svallen, &compressed_buf, &compressed_len);
sval = compressed_buf;
svallen = compressed_len;
compressed_free = session_compress_data(c->flags, ZSTR_VAL(val), ZSTR_LEN(val),
&sval, &svallen);
/* Set up command and slot info */
skey = cluster_session_key(c, ZSTR_VAL(key), ZSTR_LEN(key), &skeylen, &slot);
@@ -1297,7 +1297,7 @@ PS_WRITE_FUNC(rediscluster) {
sval, svallen);
efree(skey);
if (compressed_free) {
efree(compressed_buf);
efree(sval);
}
/* Attempt to send command */