Bug #80895 [Com]: Unexpected XML due to memory optimization in SOAP
| From: | vasilevrvv at gmail dot com | Date: | Wed, 24 Mar 2021 14:38:38 +0000 |
| Subject: | Bug #80895 [Com]: Unexpected XML due to memory optimization in SOAP | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-232975@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=80895&edit=1
ID: 80895
Comment by: vasilevrvv at gmail dot com
Reported by: vasilevrvv at gmail dot com
Summary: Unexpected XML due to memory optimization in SOAP
Status: Assigned
Type: Bug
Package: SOAP related
Operating System: Linux
PHP Version: 8.0.3
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Oh, not an object, an array, I'm sorry.
Previous Comments:
------------------------------------------------------------------------
[2021-03-24 14:33:03] vasilevrvv at gmail dot com
I think this is not obvious behavior. To avoid references - I have to clone the object in the code.
Maybe it's better to change this logic?
------------------------------------------------------------------------
[2021-03-24 14:26:22] cmb@php.net
Well, apparently ext/soap indeed not only encodes references as
multi-reference values, but also zvals with refcount > 1. The
latter doesn't look right to me for arrays, because these are
value types in PHP, but not necessarily in other languages.
------------------------------------------------------------------------
[2021-03-24 13:57:59] vasilevrvv at gmail dot com
Hmm, in php5, the behavior is generally differen ti need to research
------------------------------------------------------------------------
[2021-03-24 13:31:56] vasilevrvv at gmail dot com
each pass of the foreach is the same zval, before trying to change it. and the soap library takes
this as a reference, but it is not a reference.
------------------------------------------------------------------------
[2021-03-24 13:14:23] vasilevrvv at gmail dot com
For example, let's change not the address, but another variable, this also helped. And add call
xdebug_debug_zval before and after call:
xdebug_debug_zval('returnAddressee');
$returnAddressee['person_name'] = $returnAddressee['person_name'];
xdebug_debug_zval('returnAddressee');
Before:
(refcount=4, is_ref=0)
array (size=4)
'person_name' => (refcount=1, is_ref=0)string ',,,,,,
Here refcount=4
Call:
$returnAddressee['person_name'] = $returnAddressee['person_name'];
After
(refcount=1, is_ref=0)
array (size=4)
'person_name' => (refcount=2, is_ref=0)string '.....
Here refcount=1
When the array changes, it becomes another array, this is what causes the problem
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=80895
--
Edit this bug report at https://bugs.php.net/bug.php?id=80895&edit=1