Skip to content

Commit

Permalink
Merge branch 'pr93' of github.com:andypost/msgpack-php
Browse files Browse the repository at this point in the history
  • Loading branch information
m6w6 committed Aug 20, 2024
2 parents 94e1e40 + 1166803 commit 12aae66
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 0 deletions.
9 changes: 9 additions & 0 deletions config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down
46 changes: 46 additions & 0 deletions msgpack.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
#endif

msgpack_init_class();

REGISTER_LONG_CONSTANT("MESSAGEPACK_OPT_PHPONLY",
Expand All @@ -109,6 +126,11 @@ 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, "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);
Expand Down Expand Up @@ -300,6 +322,30 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ {
}
/* }}} */

#if defined(HAVE_APCU_SUPPORT)
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;
}
/* }}} */

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

/*
* Local variables:
* tab-width: 4
Expand Down
1 change: 1 addition & 0 deletions tests/029.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ msgpack

MessagePack Support => enabled
Session Support => enabled
MessagePack APCu Serializer ABI => %s
extension Version => %s
header Version => %s

Expand Down
63 changes: 63 additions & 0 deletions tests/apcu.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
--TEST--
APCu serialization
--INI--
apc.enabled=1
apc.enable_cli=1
apc.serializer=msgpack
--SKIPIF--
<?php
if (!extension_loaded("msgpack")) print "skip";
if (!extension_loaded("apcu")) {
echo "skip needs APCu enabled";
}
?>
--FILE--
<?php
echo ini_get('apc.serializer'), "\n";

apcu_store('foo', 100);
var_dump(apcu_fetch('foo'));

$foo = 'hello world';

apcu_store('foo', $foo);
var_dump(apcu_fetch('foo'));

apcu_store('foo\x00bar', $foo);
var_dump(apcu_fetch('foo\x00bar'));

apcu_store('foo', ['foo' => $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===

0 comments on commit 12aae66

Please sign in to comment.