|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-10-04 18:40 UTC] nate dot whittaker at gmail dot com
Description:
------------
When the binary protocol is enabled and when passing the 3rd
parameter, Memcached::GET_PRESERVE_ORDER, to getMulti(), the
resulting array contains non-unique keys.
In other words, each key is represented twice in the result.
One is set to null and the other is set to the value of
whatever was stored in memcached.
getResultMessage() shows "SUCCESS".
I'm actually on php 5.3.8
Reproduce code:
---------------
$MC = new Memcached;
$MC->setOption(Memcached::OPT_BINARY_PROTOCOL, true); // Removing this causes the code to work, but at the 'expense' of reverting to the ASCII protocol
$MC->addServer('localhost', 11211);
$KeyList = Array (
'key1'
,'key2'
,'key3'
,'key4'
);
$Test = Array();
foreach ($KeyList as $k) {
$Test[$k] = 'stored value for '.$k;
}
// This block uses the *Multi() functions
$MC->setMulti($Test, 3600);
sleep(1);
$null = null;
$theList = $MC->getMulti($KeyList, $null, Memcached::GET_PRESERVE_ORDER);
var_dump($theList);
Expected result:
----------------
var_dump should shows:
array
'key1' => 'stored value for key1'
'key2' => 'stored value for key2'
'key3' => 'stored value for key3'
'key4' => 'stored value for key4'
Actual result:
--------------
var_dump shows:
array
'key1' => null
'key2' => null
'key3' => null
'key4' => null
'key1' => 'stored value for key1'
'key2' => 'stored value for key2'
'key3' => 'stored value for key3'
'key4' => 'stored value for key4'
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 02:00:01 2025 UTC |
Confirmed. Even without the Memcached::GET_PRESERVE_ORDER option, using getMulti() with binary protocol enabled results in some kind of parsing problem that winds up making some indexes returned in the array not equal to the actual key requested. I know this sounds crazy, but if I get the key "helloworld" from memcached, doing a var_dump() of the result shows "helloworld" index in the array - however, array_key_exists("helloworld", $result) fails. Somehow the index as seen by the eye is not the same as the actual index stored by php. It's a little messed up - php does not allow for multiple entries of the same index in an array, unless memcached package somehow bypasses php's protections. I would guess that there is a NULL (byte 0) character in the string somewhere, but this is not the case. If I dump the serialize() or json_encode() of the array, a NULL character is nowhere to be seen. Thanks to the other Nate (strange coincidence) for bringing the binary protocol to light. I couldn't track down the cause of this behaviour myself, however disabling binary protocol in the client does indeed solve the problem.