ID:               48643
 User updated by:  z...@php.net
 Reported By:      z...@php.net
 Status:           Open
 Bug Type:         SPL related
 Operating System: Linux (Ubuntu)
 PHP Version:      5.2CVS-2009-06-22 (CVS)
 New Comment:

A checkout of PHP53 from the 25th June 2008 does *not* have the
problem

A checkout of PHP53 from the 26th June 2008 *does* have the problem


Previous Comments:
------------------------------------------------------------------------

[2009-06-23 14:13:37] robin_fernandes at uk dot ibm dot com

Testcase below shows that the issue relates to an implicit cast to
string on an SplFileInfo object when retrieved from a
RecursiveDirectoryIterator during iteration.

<?php
$rdi = new RecursiveDirectoryIterator('/manyFiles');

echo "SplFileInfo explicit cast to string: ";
foreach ($rdi as $v) { strlen((string)$v); } //OK
echo memory_get_usage(true) . PHP_EOL;

echo "SplFileInfo implicit cast to string: ";
foreach ($rdi as $v) { strlen($v); } //Leaky
echo memory_get_usage(true) . PHP_EOL;
?>

php52:
SplFileInfo explicit cast to string: 262144
SplFileInfo implicit cast to string: 262144

php53:
SplFileInfo explicit cast to string: 524288
SplFileInfo implicit cast to string: 6291456

------------------------------------------------------------------------

[2009-06-23 13:02:34] z...@php.net

Looking backwards through PHP builds I have currently narrowed this
down to a change that went in to PHP 5.3 somewhere between the 12th June
2008 and the 1st July 2008.

------------------------------------------------------------------------

[2009-06-23 12:13:49] robin_fernandes at uk dot ibm dot com

Below is a simplified testcase which I think exposes the same leak.
'/manyFiles' is a directory containing 10000 files.

<?php
$rii = new RecursiveIteratorIterator(
          new RecursiveDirectoryIterator('/manyFiles')
       );

function noop() {}

echo "noop call in loop (no leak)       : ";
foreach ($rii as $v) { noop($v); }
echo memory_get_usage() . PHP_EOL;

echo "strlen call in loop (leak on 53)  : ";
foreach ($rii as $v) { strlen($v); }
echo memory_get_usage() . PHP_EOL;
?>


Output on php52:
noop call in loop (no leak)       : 66176
strlen call in loop (leak on 53)  : 66176

Output on php53:
noop call in loop (no leak)       : 337448
strlen call in loop (leak on 53)  : 6028496

------------------------------------------------------------------------

[2009-06-22 14:33:05] z...@php.net

I tested with PHP 5.2 but do not see the same issue. I believe this is
specific to PHP 5.3.

------------------------------------------------------------------------

[2009-06-22 12:32:02] z...@php.net

By the way, I traced the memory consumption using xdebug:

xdebug.auto_trace = on;
xdebug.show_mem_delta = on;

The first few lines are here http://pastebin.ca/1469804

This makes it look more like a bug with the way the accept() method is
invoked inside PhptFilterIterator.

------------------------------------------------------------------------

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/48643

-- 
Edit this bug report at http://bugs.php.net/?id=48643&edit=1

Reply via email to