Hi,
I've encountered a hard-to-consistently-reproduce issue with HashTable
zvals. I have code that will generate big nested \stdClass structures for
JSON encoding. It does so using classes that have methods that generate
those fields. For example, you could have a class like this:
class Block {
public function css_classes() {
return ['x', 'y', 'z'];
}
}
Other code would translate it into a value that would var_dump()
as this:
object(stdClass)#1 (1) {
["css_classes"]=>
array(3) {
[0]=>
string(1) "x"
[1]=>
string(1) "y"
[2]=>
string(1) "z"
}
}
The template data could include multiple instances of Block. As in, a
\stdClass could be generated with multiple copies of that array content.
That data could get sent to json_encode()
, which
uses ZEND_HASH_APPLY_PROTECTION/etc. to avoid recursion. I've seen
situations where that array of strings triggers that recursion check. But
it's not always, and a php-fpm restart can make it go away.
Can anyone think of why this might happen?
Thanks,
Adam
Hey:
Hi,
I've encountered a hard-to-consistently-reproduce issue with HashTable
zvals. I have code that will generate big nested \stdClass structures for
JSON encoding. It does so using classes that have methods that generate
those fields. For example, you could have a class like this:class Block {
public function css_classes() {
return ['x', 'y', 'z'];
}
}Other code would translate it into a value that would
var_dump()
as this:object(stdClass)#1 (1) {
["css_classes"]=>
array(3) {
[0]=>
string(1) "x"
[1]=>
string(1) "y"
[2]=>
string(1) "z"
}
}The template data could include multiple instances of Block. As in, a
\stdClass could be generated with multiple copies of that array content.
That data could get sent tojson_encode()
, which
uses ZEND_HASH_APPLY_PROTECTION/etc. to avoid recursion. I've seen
situations where that array of strings triggers that recursion check. But
the array might be stored in shared memory(immutable array), in this case,
you should not edit the apply count ,
you should check it, like what json does:
https://github.com/php/php-src/blob/master/ext/json/json_encoder.c#L156
thanks
it's not always, and a php-fpm restart can make it go away.
Can anyone think of why this might happen?
Thanks,
Adam
--
Xinchen Hui
@Laruence
http://www.laruence.com/