1313#include "ext/session/php_session.h" /* for php_session_register_serializer */
1414#endif
1515
16+ #if defined(HAVE_APCU_SUPPORT )
17+ #include "ext/apcu/apc_serializer.h"
18+ #endif /* HAVE_APCU_SUPPORT */
19+
1620#include "php_msgpack.h"
1721#include "msgpack_pack.h"
1822#include "msgpack_unpack.h"
@@ -54,6 +58,12 @@ PHP_INI_END()
5458PS_SERIALIZER_FUNCS (msgpack );
5559#endif
5660
61+ #if defined(HAVE_APCU_SUPPORT )
62+ /** Apc serializer function prototypes */
63+ static int APC_SERIALIZER_NAME (msgpack ) (APC_SERIALIZER_ARGS );
64+ static int APC_UNSERIALIZER_NAME (msgpack ) (APC_UNSERIALIZER_ARGS );
65+ #endif
66+
5767static zend_function_entry msgpack_functions [] = {
5868 ZEND_FE (msgpack_serialize , arginfo_msgpack_serialize )
5969 ZEND_FE (msgpack_unserialize , arginfo_msgpack_unserialize )
@@ -88,6 +98,13 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ {
8898 php_session_register_serializer ("msgpack" , PS_SERIALIZER_ENCODE_NAME (msgpack ), PS_SERIALIZER_DECODE_NAME (msgpack ));
8999#endif
90100
101+ #if defined(HAVE_APCU_SUPPORT )
102+ apc_register_serializer ("msgpack" ,
103+ APC_SERIALIZER_NAME (msgpack ),
104+ APC_UNSERIALIZER_NAME (msgpack ),
105+ NULL );
106+ #endif
107+
91108 msgpack_init_class ();
92109
93110 REGISTER_LONG_CONSTANT ("MESSAGEPACK_OPT_PHPONLY" ,
@@ -109,6 +126,11 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ {
109126 php_info_print_table_row (2 , "MessagePack Support" , "enabled" );
110127#if HAVE_PHP_SESSION
111128 php_info_print_table_row (2 , "Session Support" , "enabled" );
129+ #endif
130+ #if defined(HAVE_APCU_SUPPORT )
131+ php_info_print_table_row (2 , "MessagePack APCu Serializer ABI" , APC_SERIALIZER_ABI );
132+ #else
133+ php_info_print_table_row (2 , "MessagePack APCu Serializer ABI" , "no" );
112134#endif
113135 php_info_print_table_row (2 , "extension Version" , PHP_MSGPACK_VERSION );
114136 php_info_print_table_row (2 , "header Version" , MSGPACK_VERSION );
@@ -300,6 +322,30 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ {
300322}
301323/* }}} */
302324
325+ #if defined(HAVE_APCU_SUPPORT )
326+ static int APC_SERIALIZER_NAME (msgpack ) ( APC_SERIALIZER_ARGS ) /* {{{ */ {
327+ smart_str res = {0 };
328+ php_msgpack_serialize (& res , (zval * ) value );
329+
330+ if (res .s ) {
331+ smart_str_0 (& res );
332+ * buf = (unsigned char * ) estrndup (ZSTR_VAL (res .s ), ZSTR_LEN (res .s ));
333+ * buf_len = ZSTR_LEN (res .s );
334+ return 1 ;
335+ }
336+ return 0 ;
337+ }
338+ /* }}} */
339+
340+ static int APC_UNSERIALIZER_NAME (msgpack ) ( APC_UNSERIALIZER_ARGS ) /* {{{ */ {
341+ if (buf_len > 0 && php_msgpack_unserialize (value , buf , buf_len ) == SUCCESS ) {
342+ return 1 ;
343+ }
344+ return 0 ;
345+ }
346+ /* }}} */
347+ #endif
348+
303349/*
304350 * Local variables:
305351 * tab-width: 4
0 commit comments