#35258 [WFx->Opn]: preg_replace() doesn't seem to release the memory used

From: Date: Sun, 05 Feb 2006 20:20:36 +0000
Subject: #35258 [WFx->Opn]: preg_replace() doesn't seem to release the memory used
References: 1  Groups: php.doc 
Request: Send a blank email to phpdoc+get-969371830@lists.php.net to get a copy of this message
ID: 35258 Updated by: mfischer@php.net Reported By: mfischer@php.net -Status: Wont fix +Status: Open Bug Type: Documentation problem Operating System: Linux PHP Version: 4.4.1 New Comment: I think PHP users definitely want to now about this. Why should they not want to know? I think it's important to know that the preg_* functions cache the regular expression while ereg don't. Because that means that preg* over ereg* consumes memory in the long term, which, as I i've seen it in real live, became an issue. Since I had this spontanous memory problems I consulted the preg* manual page but nowwhere it wasn't mentioned and I hat to find it out myself which took some time. Why not shorten other peoples time by documenting it? Previous Comments: ------------------------------------------------------------------------ [2005-12-13 20:01:22] nlopess@php.net The pcre extension API (used by preg_*() functions, the new filter extension,..) cache compiled regexes, but since PHP xx (I don't remember the version.. :) ), that cache has a limit. So memory usage won't grow indefinetely, it will "just" cache 4096 regexes (by default). I don't think this should be documented. PHP users don't really want to know about internal stuff. ------------------------------------------------------------------------ [2005-12-13 11:45:34] mfischer@php.net No doubt. However, the ereg* family of functions does not consume memory in the way the preg* family of functions does. So this is actually a documentation problem it seems, re-cateogrizing. ------------------------------------------------------------------------ [2005-12-13 10:45:03] sniper@php.net This is the same issue as all the other "PHP does not release memory" reports. The memory reserved is never released during script run. It's released during shutdown. ------------------------------------------------------------------------ [2005-12-13 09:53:55] mfischer@php.net Your answer is interesting. If I take your example and insert another var_dump() before the unset() command, like this: <?php var_dump(memory_get_usage()); $input = str_pad("", 50000, "foo"); var_dump(memory_get_usage()); $input = preg_replace(";foo;", "", $input); var_dump(memory_get_usage()); unset($input); // <------------ !! var_dump(memory_get_usage()); I get these numbers: $ php test.php int(15496) int(65600) int(115632) int(15624) However, there is not benefit in unsetting the return value from preg_replace else I could remove the call to it anyway. But maybe the example was bad. Take for example, I want to replace 'foo' with 'bar': <?php var_dump(memory_get_usage()); $input = str_pad("", 50000, "foo"); var_dump(memory_get_usage()); $input = preg_replace(";foo;", "bar", $input); var_dump(memory_get_usage()); $ php test.php int(15208) int(65312) int(115352) If I want to further work with the value I have no way of saving memory (I can't really unset the value when I need it). I also don't quite understand the statement "memory usage doesn't depend on the length of the data". The numbers are certainly different when I use small strings. ------------------------------------------------------------------------ [2005-11-17 13:59:29] tony2001@php.net Memory usage doesn't depend on the length of the data. Try this code: <?php var_dump(memory_get_usage()); $input = str_pad("", 50000, "foo"); var_dump(memory_get_usage()); $input = preg_replace(";foo;", "", $input); unset($input); // <------------ !! var_dump(memory_get_usage()); ?> ------------------------------------------------------------------------ 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 http://bugs.php.net/35258 -- Edit this bug report at http://bugs.php.net/?id=35258&edit=1

« previous php.doc (#969371830) next »