Apparently the impossibility of changing a PHP variable when using the Memcached collection method

I have a rather strange problem. Due to a specific PECL error , I pass var to memcached and it changes. The proposed workaround is to pass $data.''instead $dataand destroy the link. But this will not work for me, because I do not just pass strings to memcached, I pass all data types.

So, I assigned a new type variable $dataPass = $dataand passed $dataPass. But something really strange is happening:

// ...

var_dump("data 1");
var_dump($data);

$dataPass = $data; // Dereferencing the variable 
                   // because of http://pecl.php.net/bugs/bug.php?id=14239

var_dump("data 2");
var_dump($data);
var_dump("dataPass 2");
var_dump($dataPass);

$this->memcache->set($key, $dataPass, false, time() + $expire);

var_dump("data 3");
var_dump($data);
var_dump("dataPass 3");
var_dump($dataPass);

/*
string(11) "data 1"
bool(false)
string(22) "data 2"
bool(false)
string(26) "dataPass 2"
bool(false)
string(10) "data 3"
string(0) ""                    <--- Why is this not bool(false)?
string(14) "dataPass 3"
string(0) ""
*/
+3
source share
1 answer

, , memcache (.. ).

:

$dataPass = $data;

, . . .

, :

$data = false; //$data zval: refcount 1, is_ref 0
$dataPassPre =& $data; //$data/$dataPassPre zval: refcount 2, is_ref 1
//equivalently to below: $dataPass = $dataPassPre;
$dataPass = $data; //$dataPass zval: has refcount 1, is_ref 0
unset($dataPassPre); //restore $data zval to refcount 1, is_ref 0
//now pass $dataPass
+1

Source: https://habr.com/ru/post/1764421/


All Articles