ID: 35258
Updated by: [EMAIL PROTECTED]
Reported By: [EMAIL PROTECTED]
-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] [EMAIL PROTECTED]
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] [EMAIL PROTECTED]
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] [EMAIL PROTECTED]
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] [EMAIL PROTECTED]
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] [EMAIL PROTECTED]
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