Skip to content

Commit 7fefcb7

Browse files
authored
Make the compression_level at settable option and expand it to zlib (#540)
Make it possible to use setOption to set Memcached::OPT_COMPRESSION_LEVEL which was missed in the original zstd PR #539 zlib compression was using the default zlib compression level of 6. With this PR it is now possible to choose other levels for zlib as well. The default remains at 6 so nothing will change for people upgrading unless they explicitly set a different level. Here is some more benchmarking data using php serialized data https://gist.github.com/rlerdorf/b9bae385446d5a30b65e6e241e34d0a8 fastlz is not really useful at any value size anymore. Anybody looking for lightning quick compression and decompression should use zstd at level 1. compression_level is not applied to fastlz because it only has 2 levels and php-memcached already switches from level 1 to 2 automatically for values larger than 65535 bytes. Forcing it to one or the other doesn't seem useful.
1 parent e39a2e6 commit 7fefcb7

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

Diff for: php_memcached.c

+24-5
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ zend_bool s_invoke_cache_callback(zval *zobject, zend_fcall_info *fci, zend_fcal
884884
****************************************/
885885

886886
static
887-
zend_bool s_compress_value (php_memc_compression_type compression_type, zend_string **payload_in, uint32_t *flags)
887+
zend_bool s_compress_value (php_memc_compression_type compression_type, zend_long compression_level, zend_string **payload_in, uint32_t *flags)
888888
{
889889
/* status */
890890
zend_bool compress_status = 0;
@@ -915,7 +915,13 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
915915
#ifdef HAVE_ZSTD_H
916916
case COMPRESSION_TYPE_ZSTD:
917917
{
918-
compressed_size = ZSTD_compress((void *)buffer, buffer_size, ZSTR_VAL(payload), ZSTR_LEN(payload), MEMC_G(compression_level));
918+
compressed_size = ZSTD_compress((void *)buffer, buffer_size, ZSTR_VAL(payload), ZSTR_LEN(payload), compression_level);
919+
920+
if (compression_level < -22) {
921+
compression_level = -22;
922+
} else if (compression_level > 22) {
923+
compression_level = 22;
924+
}
919925

920926
if (!ZSTD_isError(compressed_size)) {
921927
compress_status = 1;
@@ -928,7 +934,14 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
928934
case COMPRESSION_TYPE_ZLIB:
929935
{
930936
compressed_size = buffer_size;
931-
int status = compress((Bytef *) buffer, &compressed_size, (Bytef *) ZSTR_VAL(payload), ZSTR_LEN(payload));
937+
938+
if (compression_level < 0) {
939+
compression_level = 0;
940+
} else if (compression_level > 9) {
941+
compression_level = 9;
942+
}
943+
944+
int status = compress2((Bytef *) buffer, &compressed_size, (Bytef *) ZSTR_VAL(payload), ZSTR_LEN(payload), compression_level);
932945

933946
if (status == Z_OK) {
934947
compress_status = 1;
@@ -1120,7 +1133,7 @@ zend_string *s_zval_to_payload(php_memc_object_t *intern, zval *value, uint32_t
11201133
*
11211134
* No need to check the return value because the payload is always valid.
11221135
*/
1123-
(void)s_compress_value (memc_user_data->compression_type, &payload, flags);
1136+
(void)s_compress_value (memc_user_data->compression_type, memc_user_data->compression_level, &payload, flags);
11241137
}
11251138

11261139
if (memc_user_data->set_udf_flags >= 0) {
@@ -1325,6 +1338,7 @@ static PHP_METHOD(Memcached, __construct)
13251338
memc_user_data = pecalloc (1, sizeof(*memc_user_data), is_persistent);
13261339
memc_user_data->serializer = MEMC_G(serializer_type);
13271340
memc_user_data->compression_type = MEMC_G(compression_type);
1341+
memc_user_data->compression_level = MEMC_G(compression_level);
13281342
memc_user_data->compression_enabled = 1;
13291343
memc_user_data->encoding_enabled = 0;
13301344
memc_user_data->store_retry_count = MEMC_G(store_retry_count);
@@ -3075,6 +3089,11 @@ int php_memc_set_option(php_memc_object_t *intern, long option, zval *value)
30753089
}
30763090
break;
30773091

3092+
case MEMC_OPT_COMPRESSION_LEVEL:
3093+
lval = zval_get_long(value);
3094+
memc_user_data->compression_level = lval;
3095+
break;
3096+
30783097
case MEMC_OPT_ITEM_SIZE_LIMIT:
30793098
lval = zval_get_long(value);
30803099
if (lval < 0) {
@@ -4054,7 +4073,7 @@ PHP_GINIT_FUNCTION(php_memcached)
40544073
php_memcached_globals->memc.compression_threshold = 2000;
40554074
php_memcached_globals->memc.compression_type = COMPRESSION_TYPE_FASTLZ;
40564075
php_memcached_globals->memc.compression_factor = 1.30;
4057-
php_memcached_globals->memc.compression_level = 3;
4076+
php_memcached_globals->memc.compression_level = 6;
40584077
php_memcached_globals->memc.store_retry_count = 2;
40594078
php_memcached_globals->memc.item_size_limit = 0;
40604079

0 commit comments

Comments
 (0)