13
13
#include "ext/session/php_session.h" /* for php_session_register_serializer */
14
14
#endif
15
15
16
+ #if defined(HAVE_APCU_SUPPORT )
17
+ #include "ext/apcu/apc_serializer.h"
18
+ #endif /* HAVE_APCU_SUPPORT */
19
+
16
20
#include "php_msgpack.h"
17
21
#include "msgpack_pack.h"
18
22
#include "msgpack_unpack.h"
@@ -54,6 +58,12 @@ PHP_INI_END()
54
58
PS_SERIALIZER_FUNCS (msgpack );
55
59
#endif
56
60
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
+
57
67
static zend_function_entry msgpack_functions [] = {
58
68
ZEND_FE (msgpack_serialize , arginfo_msgpack_serialize )
59
69
ZEND_FE (msgpack_unserialize , arginfo_msgpack_unserialize )
@@ -88,6 +98,13 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ {
88
98
php_session_register_serializer ("msgpack" , PS_SERIALIZER_ENCODE_NAME (msgpack ), PS_SERIALIZER_DECODE_NAME (msgpack ));
89
99
#endif
90
100
101
+ #if defined(HAVE_APCU_SUPPORT )
102
+ apc_register_serializer ("msgpack" ,
103
+ APC_SERIALIZER_NAME (msgpack ),
104
+ APC_UNSERIALIZER_NAME (msgpack ),
105
+ NULL TSRMLS_CC );
106
+ #endif
107
+
91
108
msgpack_init_class ();
92
109
93
110
REGISTER_LONG_CONSTANT ("MESSAGEPACK_OPT_PHPONLY" ,
@@ -109,6 +126,9 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ {
109
126
php_info_print_table_row (2 , "MessagePack Support" , "enabled" );
110
127
#if HAVE_PHP_SESSION
111
128
php_info_print_table_row (2 , "Session Support" , "enabled" );
129
+ #endif
130
+ #if defined(HAVE_APCU_SUPPORT )
131
+ php_info_print_table_row (2 , "APCu Serializer Support" , "enabled" );
112
132
#endif
113
133
php_info_print_table_row (2 , "extension Version" , PHP_MSGPACK_VERSION );
114
134
php_info_print_table_row (2 , "header Version" , MSGPACK_VERSION );
@@ -300,6 +320,54 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ {
300
320
}
301
321
/* }}} */
302
322
323
+ #if defined(HAVE_APCU_SUPPORT )
324
+ /* {{{ apc_serialize function */
325
+ static int APC_SERIALIZER_NAME (msgpack ) ( APC_SERIALIZER_ARGS ) {
326
+ (void )config ;
327
+
328
+ smart_str res = {0 };
329
+ msgpack_serialize_data_t var_hash ;
330
+
331
+ msgpack_serialize_var_init (& var_hash );
332
+ msgpack_serialize_zval (& res , (zval * ) value , var_hash );
333
+ msgpack_serialize_var_destroy (& var_hash );
334
+
335
+ smart_str_0 (& res );
336
+
337
+ * buf = (unsigned char * ) estrndup (ZSTR_VAL (res .s ), ZSTR_LEN (res .s ));
338
+ * buf_len = ZSTR_LEN (res .s );
339
+
340
+ return 1 ;
341
+ }
342
+ /* }}} */
343
+ /* {{{ apc_unserialize function */
344
+ static int APC_UNSERIALIZER_NAME (msgpack ) ( APC_UNSERIALIZER_ARGS ) {
345
+ (void )config ;
346
+
347
+ int ret ;
348
+ msgpack_unpack_t mp ;
349
+ msgpack_unserialize_data_t var_hash ;
350
+ size_t off = 0 ;
351
+
352
+ template_init (& mp );
353
+
354
+ msgpack_unserialize_var_init (& var_hash );
355
+
356
+ mp .user .retval = value ;
357
+ mp .user .var_hash = & var_hash ;
358
+
359
+ ret = template_execute (& mp , (char * ) buf , buf_len , & off );
360
+ if (Z_TYPE_P (mp .user .retval ) == IS_REFERENCE ) {
361
+ ZVAL_DEREF (mp .user .retval );
362
+ }
363
+
364
+ msgpack_unserialize_var_destroy (& var_hash , 0 );
365
+
366
+ return ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS ;
367
+ }
368
+ /* }}} */
369
+ #endif
370
+
303
371
/*
304
372
* Local variables:
305
373
* tab-width: 4
0 commit comments