#35258 [WFx->Opn]: preg_replace() doesn't seem to release the memory used
| From: | mfischer@php.net | 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