Skip to content

Commit 4b6c45d

Browse files
committed
implement stats callback suggestions by Remi
1 parent 6dc086e commit 4b6c45d

File tree

3 files changed

+59
-27
lines changed

3 files changed

+59
-27
lines changed

php_memcached_server.c

+25-20
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void *
519519
} else {
520520
ZVAL_NULL(&zkey);
521521
}
522-
ZVAL_NULL(&zstats);
522+
array_init(&zstats);
523523
ZVAL_MAKE_REF(&zstats);
524524

525525
ZVAL_COPY(&params[0], &zcookie);
@@ -529,29 +529,34 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void *
529529
retval = s_invoke_php_callback (&MEMC_GET_CB(MEMC_SERVER_ON_STAT), params, 3);
530530

531531
if (retval == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
532-
if (Z_ISNULL(zstats)) {
533-
retval = response_handler(cookie, NULL, 0, NULL, 0);
534-
} else {
535-
zval *zarray = &zstats;
536-
zend_string *key;
537-
zval *val;
538-
539-
ZVAL_DEREF(zarray);
540-
if (Z_TYPE_P(zarray) != IS_ARRAY) {
541-
convert_to_array(zarray);
542-
}
532+
zval *zarray = &zstats;
533+
zend_string *key;
534+
zend_long idx;
535+
zval *val;
536+
537+
ZVAL_DEREF(zarray);
538+
if (Z_TYPE_P(zarray) != IS_ARRAY) {
539+
convert_to_array(zarray);
540+
}
543541

544-
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zarray), key, val)
545-
{
546-
zend_string *val_str = zval_get_string(val);
542+
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(zarray), idx, key, val)
543+
{
544+
zend_string *val_str = zval_get_string(val);
545+
546+
if (key) {
547547
retval = response_handler(cookie, key->val, key->len, val_str->val, val_str->len);
548-
if (retval != PROTOCOL_BINARY_RESPONSE_SUCCESS) {
549-
break;
550-
}
551-
zend_string_release(val_str);
548+
} else {
549+
char buf[0x20], *ptr, *end = &buf[sizeof(buf) - 1];
550+
ptr = zend_print_long_to_buf(end, idx);
551+
retval = response_handler(cookie, ptr, end - ptr, val_str->val, val_str->len);
552+
}
553+
zend_string_release(val_str);
554+
555+
if (retval != PROTOCOL_BINARY_RESPONSE_SUCCESS) {
556+
break;
552557
}
553-
ZEND_HASH_FOREACH_END();
554558
}
559+
ZEND_HASH_FOREACH_END();
555560
}
556561

557562
zval_ptr_dtor(&params[0]);

tests/memcachedserver.phpt

+22
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ $cache->replace ('replace_key', 'value 2', 200);
3737
var_dump($cache->getVersion());
3838
var_dump($cache->getStats());
3939
var_dump($cache->getStats("foobar"));
40+
var_dump($cache->getStats("scalar"));
41+
var_dump($cache->getStats("numeric array"));
4042

4143
$cache->quit();
4244

@@ -84,5 +86,25 @@ array(1) {
8486
string(3) "bar"
8587
}
8688
}
89+
client_id=[%s]: Stat key=[scalar]
90+
array(1) {
91+
["127.0.0.1:3434"]=>
92+
array(1) {
93+
[0]=>
94+
string(%d) "you want it, you get it"
95+
}
96+
}
97+
client_id=[%s]: Stat key=[numeric array]
98+
array(1) {
99+
["127.0.0.1:3434"]=>
100+
array(3) {
101+
[-1]=>
102+
string(3) "one"
103+
[0]=>
104+
string(3) "two"
105+
[1]=>
106+
string(5) "three"
107+
}
108+
}
87109
client_id=[%s]: Client quit
88110
Done

tests/server.php

+12-7
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,18 @@ function ($client_id, $key, $value, $flags, $expiration, $cas, &$result_cas) {
7777
});
7878

7979
$server->on (Memcached::ON_STAT,
80-
function ($client_id, $key, array &$values = null) {
81-
echo "client_id=[$client_id]: Stat key=[$key]" . PHP_EOL;
82-
$values = [
83-
"key" => $key,
84-
"foo" => "bar",
85-
];
86-
return Memcached::RESPONSE_SUCCESS;
80+
function ($client_id, $key, array &$values) {
81+
echo "client_id=[$client_id]: Stat key=[$key]" . PHP_EOL;
82+
83+
if ($key === "scalar") {
84+
$values = "you want it, you get it";
85+
} elseif ($key === "numeric array") {
86+
$values = [-1 => "one", "two", "three"];
87+
} else {
88+
$values["key"] = $key;
89+
$values["foo"] = "bar";
90+
}
91+
return Memcached::RESPONSE_SUCCESS;
8792
});
8893

8994
$server->on (Memcached::ON_VERSION,

0 commit comments

Comments
 (0)