From 6a2b4598334cb83b479efea85796cb60a538bd69 Mon Sep 17 00:00:00 2001 From: Andrea Baron Date: Mon, 4 Jul 2016 19:40:02 +0200 Subject: [PATCH 1/3] Allow using msgpack as serializer for APCu --- config.m4 | 9 ++++++++ msgpack.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/config.m4 b/config.m4 index 5a3fe1a..6178d4e 100644 --- a/config.m4 +++ b/config.m4 @@ -5,6 +5,15 @@ Make sure that the comment is aligned: [ --with-msgpack Include msgpack support]) if test "$PHP_MSGPACK" != "no"; then + AC_MSG_CHECKING([for APC/APCU includes]) + if test -f "$phpincludedir/ext/apcu/apc_serializer.h"; then + apc_inc_path="$phpincludedir" + AC_MSG_RESULT([APCU in $apc_inc_path]) + AC_DEFINE(HAVE_APCU_SUPPORT,1,[Whether to enable apcu support]) + else + AC_MSG_RESULT([not found]) + fi + PHP_NEW_EXTENSION(msgpack, msgpack.c msgpack_pack.c msgpack_unpack.c msgpack_class.c msgpack_convert.c, $ext_shared) ifdef([PHP_INSTALL_HEADERS], diff --git a/msgpack.c b/msgpack.c index bc01848..8028f01 100644 --- a/msgpack.c +++ b/msgpack.c @@ -13,6 +13,10 @@ #include "ext/session/php_session.h" /* for php_session_register_serializer */ #endif +#if defined(HAVE_APCU_SUPPORT) +#include "ext/apcu/apc_serializer.h" +#endif /* HAVE_APCU_SUPPORT */ + #include "php_msgpack.h" #include "msgpack_pack.h" #include "msgpack_unpack.h" @@ -54,6 +58,12 @@ PHP_INI_END() PS_SERIALIZER_FUNCS(msgpack); #endif +#if defined(HAVE_APCU_SUPPORT) +/** Apc serializer function prototypes */ +static int APC_SERIALIZER_NAME(msgpack) (APC_SERIALIZER_ARGS); +static int APC_UNSERIALIZER_NAME(msgpack) (APC_UNSERIALIZER_ARGS); +#endif + static zend_function_entry msgpack_functions[] = { ZEND_FE(msgpack_serialize, arginfo_msgpack_serialize) ZEND_FE(msgpack_unserialize, arginfo_msgpack_unserialize) @@ -88,6 +98,13 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ { php_session_register_serializer("msgpack", PS_SERIALIZER_ENCODE_NAME(msgpack), PS_SERIALIZER_DECODE_NAME(msgpack)); #endif +#if defined(HAVE_APCU_SUPPORT) + apc_register_serializer("msgpack", + APC_SERIALIZER_NAME(msgpack), + APC_UNSERIALIZER_NAME(msgpack), + NULL TSRMLS_CC); +#endif + msgpack_init_class(); REGISTER_LONG_CONSTANT("MESSAGEPACK_OPT_PHPONLY", @@ -109,6 +126,9 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ { php_info_print_table_row(2, "MessagePack Support", "enabled"); #if HAVE_PHP_SESSION php_info_print_table_row(2, "Session Support", "enabled" ); +#endif +#if defined(HAVE_APCU_SUPPORT) + php_info_print_table_row(2, "APCu Serializer Support", "enabled" ); #endif php_info_print_table_row(2, "extension Version", PHP_MSGPACK_VERSION); php_info_print_table_row(2, "header Version", MSGPACK_VERSION); @@ -300,6 +320,54 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ { } /* }}} */ +#if defined(HAVE_APCU_SUPPORT) +/* {{{ apc_serialize function */ +static int APC_SERIALIZER_NAME(msgpack) ( APC_SERIALIZER_ARGS ) { + (void)config; + + smart_str res = {0}; + msgpack_serialize_data_t var_hash; + + msgpack_serialize_var_init(&var_hash); + msgpack_serialize_zval(&res, (zval *) value, var_hash); + msgpack_serialize_var_destroy(&var_hash); + + smart_str_0(&res); + + *buf = (unsigned char *) estrndup(ZSTR_VAL(res.s), ZSTR_LEN(res.s)); + *buf_len = ZSTR_LEN(res.s); + + return 1; +} +/* }}} */ +/* {{{ apc_unserialize function */ +static int APC_UNSERIALIZER_NAME(msgpack) ( APC_UNSERIALIZER_ARGS ) { + (void)config; + + int ret; + msgpack_unpack_t mp; + msgpack_unserialize_data_t var_hash; + size_t off = 0; + + template_init(&mp); + + msgpack_unserialize_var_init(&var_hash); + + mp.user.retval = value; + mp.user.var_hash = &var_hash; + + ret = template_execute(&mp, (char *) buf, buf_len, &off); + if (Z_TYPE_P(mp.user.retval) == IS_REFERENCE) { + ZVAL_DEREF(mp.user.retval); + } + + msgpack_unserialize_var_destroy(&var_hash, 0); + + return ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS; +} +/* }}} */ +#endif + /* * Local variables: * tab-width: 4 From 0a53e9fcbef5ed1ee5192de5cd83ab35f54e473d Mon Sep 17 00:00:00 2001 From: Andrea Baron Date: Mon, 4 Jul 2016 19:56:48 +0200 Subject: [PATCH 2/3] Fixed test for module info --- tests/029.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/029.phpt b/tests/029.phpt index a7e3887..71a1b56 100644 --- a/tests/029.phpt +++ b/tests/029.phpt @@ -44,6 +44,7 @@ msgpack MessagePack Support => enabled Session Support => enabled +APCu Serializer Support => enabled extension Version => %s header Version => %s From 1166803839a7f30077ec98f3fd950db390dd3c22 Mon Sep 17 00:00:00 2001 From: Andy Postnikov Date: Thu, 9 Sep 2021 08:47:16 +0300 Subject: [PATCH 3/3] Use public API and add test --- msgpack.c | 68 +++++++++++++++++-------------------------------- tests/029.phpt | 2 +- tests/apcu.phpt | 63 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 46 deletions(-) create mode 100644 tests/apcu.phpt diff --git a/msgpack.c b/msgpack.c index 8028f01..1d332b5 100644 --- a/msgpack.c +++ b/msgpack.c @@ -99,10 +99,10 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ { #endif #if defined(HAVE_APCU_SUPPORT) - apc_register_serializer("msgpack", - APC_SERIALIZER_NAME(msgpack), - APC_UNSERIALIZER_NAME(msgpack), - NULL TSRMLS_CC); + apc_register_serializer("msgpack", + APC_SERIALIZER_NAME(msgpack), + APC_UNSERIALIZER_NAME(msgpack), + NULL); #endif msgpack_init_class(); @@ -128,7 +128,9 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ { php_info_print_table_row(2, "Session Support", "enabled" ); #endif #if defined(HAVE_APCU_SUPPORT) - php_info_print_table_row(2, "APCu Serializer Support", "enabled" ); + php_info_print_table_row(2, "MessagePack APCu Serializer ABI", APC_SERIALIZER_ABI); +#else + php_info_print_table_row(2, "MessagePack APCu Serializer ABI", "no"); #endif php_info_print_table_row(2, "extension Version", PHP_MSGPACK_VERSION); php_info_print_table_row(2, "header Version", MSGPACK_VERSION); @@ -321,49 +323,25 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ { /* }}} */ #if defined(HAVE_APCU_SUPPORT) -/* {{{ apc_serialize function */ -static int APC_SERIALIZER_NAME(msgpack) ( APC_SERIALIZER_ARGS ) { - (void)config; - - smart_str res = {0}; - msgpack_serialize_data_t var_hash; - - msgpack_serialize_var_init(&var_hash); - msgpack_serialize_zval(&res, (zval *) value, var_hash); - msgpack_serialize_var_destroy(&var_hash); - - smart_str_0(&res); - - *buf = (unsigned char *) estrndup(ZSTR_VAL(res.s), ZSTR_LEN(res.s)); - *buf_len = ZSTR_LEN(res.s); - - return 1; +static int APC_SERIALIZER_NAME(msgpack) ( APC_SERIALIZER_ARGS ) /* {{{ */ { + smart_str res = {0}; + php_msgpack_serialize(&res, (zval *) value); + + if (res.s) { + smart_str_0(&res); + *buf = (unsigned char *) estrndup(ZSTR_VAL(res.s), ZSTR_LEN(res.s)); + *buf_len = ZSTR_LEN(res.s); + return 1; + } + return 0; } /* }}} */ -/* {{{ apc_unserialize function */ -static int APC_UNSERIALIZER_NAME(msgpack) ( APC_UNSERIALIZER_ARGS ) { - (void)config; - - int ret; - msgpack_unpack_t mp; - msgpack_unserialize_data_t var_hash; - size_t off = 0; - template_init(&mp); - - msgpack_unserialize_var_init(&var_hash); - - mp.user.retval = value; - mp.user.var_hash = &var_hash; - - ret = template_execute(&mp, (char *) buf, buf_len, &off); - if (Z_TYPE_P(mp.user.retval) == IS_REFERENCE) { - ZVAL_DEREF(mp.user.retval); - } - - msgpack_unserialize_var_destroy(&var_hash, 0); - - return ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS; +static int APC_UNSERIALIZER_NAME(msgpack) ( APC_UNSERIALIZER_ARGS ) /* {{{ */ { + if (buf_len > 0 && php_msgpack_unserialize(value, buf, buf_len) == SUCCESS) { + return 1; + } + return 0; } /* }}} */ #endif diff --git a/tests/029.phpt b/tests/029.phpt index 71a1b56..45eb732 100644 --- a/tests/029.phpt +++ b/tests/029.phpt @@ -44,7 +44,7 @@ msgpack MessagePack Support => enabled Session Support => enabled -APCu Serializer Support => enabled +MessagePack APCu Serializer ABI => %s extension Version => %s header Version => %s diff --git a/tests/apcu.phpt b/tests/apcu.phpt new file mode 100644 index 0000000..0f3489e --- /dev/null +++ b/tests/apcu.phpt @@ -0,0 +1,63 @@ +--TEST-- +APCu serialization +--INI-- +apc.enabled=1 +apc.enable_cli=1 +apc.serializer=msgpack +--SKIPIF-- + +--FILE-- + $foo]); +var_dump(apcu_fetch('foo')); + +class Foo { + public $int = 10; + protected $array = []; + private $string = 'foo'; +} + +$a = new Foo; +apcu_store('foo', $a); +unset($a); +var_dump(apcu_fetch('foo')); + +?> +===DONE=== +--EXPECT-- +msgpack +int(100) +string(11) "hello world" +string(11) "hello world" +array(1) { + ["foo"]=> + string(11) "hello world" +} +object(Foo)#1 (3) { + ["int"]=> + int(10) + ["array":protected]=> + array(0) { + } + ["string":"Foo":private]=> + string(3) "foo" +} +===DONE===