|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2021-06-15 17:27 UTC] jnelson at archive dot org
Description: ------------ As seen here: https://3v4l.org/KPJ62#focus=eol This program loops thousands of times calling serialize() and unserialize() on associative arrays with a string key and an integer value without holding long-term references to any of the data. Prior to 7.3, this program would peak at a few hundred KB. With 7.3.0 forward, this program consumes megabytes. The two flags at the top of the program can be used to confirm (a) the memory leak only occurs with associative arrays, and (b) it's caused by unserialize() and not serialize(). Test script: --------------- The core of the linked program to repro the problem: function load($str) { $php = serialize([ $str => 1 ]); unserialize($php); } for ($ctr = 0; $ctr < 50000; $ctr++) load("foo_$ctr"); echo memory_get_peak_usage(); Expected result: ---------------- Prior to 7.3.0, my linked program produces this output (or similar numbers): Usage: 377.99 K Peak: 414.33 K Actual result: -------------- With 7.3.0 to 8.0.3, the numbers look like this: Usage: 4.73 M Peak: 5.34 M PatchesPull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 11:00:02 2025 UTC |
First, I suggest to use something like <?php $mem0 = memory_get_usage(); for ($ctr = 0; $ctr < 50000; $ctr++) load("foo_$ctr"); $mem1 = memory_get_usage(); var_dump($mem1 - $mem0); ?> to see the *relative* memory usage. Anyhow, as of PHP 7.3.0, unserialized string keys are interned[1]. If OPcache is enabled, there is actually only one copy for all 50.000 keys. If OPcache is disabled, these strings are allocated permanently in process memory. [1] <https://github.com/php/php-src/commit/03da5f8e30cc65584d38d478ea566062ff99579b>