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"
@@ -57,6 +61,12 @@ PHP_INI_END()
5761PS_SERIALIZER_FUNCS (msgpack );
5862#endif
5963
64+ #if defined(HAVE_APCU_SUPPORT )
65+ /** Apc serializer function prototypes */
66+ static int APC_SERIALIZER_NAME (msgpack ) (APC_SERIALIZER_ARGS );
67+ static int APC_UNSERIALIZER_NAME (msgpack ) (APC_UNSERIALIZER_ARGS );
68+ #endif
69+
6070static zend_function_entry msgpack_functions [] = {
6171 ZEND_FE (msgpack_serialize , arginfo_msgpack_serialize )
6272 ZEND_FE (msgpack_unserialize , arginfo_msgpack_unserialize )
@@ -92,6 +102,13 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ {
92102 php_session_register_serializer ("msgpack" , PS_SERIALIZER_ENCODE_NAME (msgpack ), PS_SERIALIZER_DECODE_NAME (msgpack ));
93103#endif
94104
105+ #if defined(HAVE_APCU_SUPPORT )
106+ apc_register_serializer ("msgpack" ,
107+ APC_SERIALIZER_NAME (msgpack ),
108+ APC_UNSERIALIZER_NAME (msgpack ),
109+ NULL TSRMLS_CC );
110+ #endif
111+
95112 msgpack_init_class ();
96113
97114 REGISTER_LONG_CONSTANT ("MESSAGEPACK_OPT_PHPONLY" ,
@@ -115,6 +132,9 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ {
115132 php_info_print_table_row (2 , "MessagePack Support" , "enabled" );
116133#if HAVE_PHP_SESSION
117134 php_info_print_table_row (2 , "Session Support" , "enabled" );
135+ #endif
136+ #if defined(HAVE_APCU_SUPPORT )
137+ php_info_print_table_row (2 , "APCu Serializer Support" , "enabled" );
118138#endif
119139 php_info_print_table_row (2 , "extension Version" , PHP_MSGPACK_VERSION );
120140 php_info_print_table_row (2 , "header Version" , MSGPACK_VERSION );
@@ -306,6 +326,54 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ {
306326}
307327/* }}} */
308328
329+ #if defined(HAVE_APCU_SUPPORT )
330+ /* {{{ apc_serialize function */
331+ static int APC_SERIALIZER_NAME (msgpack ) ( APC_SERIALIZER_ARGS ) {
332+ (void )config ;
333+
334+ smart_str res = {0 };
335+ msgpack_serialize_data_t var_hash ;
336+
337+ msgpack_serialize_var_init (& var_hash );
338+ msgpack_serialize_zval (& res , (zval * ) value , var_hash );
339+ msgpack_serialize_var_destroy (& var_hash );
340+
341+ smart_str_0 (& res );
342+
343+ * buf = (unsigned char * ) estrndup (ZSTR_VAL (res .s ), ZSTR_LEN (res .s ));
344+ * buf_len = ZSTR_LEN (res .s );
345+
346+ return 1 ;
347+ }
348+ /* }}} */
349+ /* {{{ apc_unserialize function */
350+ static int APC_UNSERIALIZER_NAME (msgpack ) ( APC_UNSERIALIZER_ARGS ) {
351+ (void )config ;
352+
353+ int ret ;
354+ msgpack_unpack_t mp ;
355+ msgpack_unserialize_data_t var_hash ;
356+ size_t off = 0 ;
357+
358+ template_init (& mp );
359+
360+ msgpack_unserialize_var_init (& var_hash );
361+
362+ mp .user .retval = value ;
363+ mp .user .var_hash = & var_hash ;
364+
365+ ret = template_execute (& mp , (char * ) buf , buf_len , & off );
366+ if (Z_TYPE_P (mp .user .retval ) == IS_REFERENCE ) {
367+ ZVAL_DEREF (mp .user .retval );
368+ }
369+
370+ msgpack_unserialize_var_destroy (& var_hash , 0 );
371+
372+ return ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS ;
373+ }
374+ /* }}} */
375+ #endif
376+
309377/*
310378 * Local variables:
311379 * tab-width: 4
0 commit comments