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

 ID:               51523
 User updated by:  evilzluk at gmail dot com
 Reported by:      evilzluk at gmail dot com
 Summary:          Memory leak on fread()
-Status:           Open
+Status:           Closed
 Type:             Bug
 Package:          Performance problem
 Operating System: Linux
 PHP Version:      Irrelevant

 New Comment:

resolved adding to cronjob:

sync

echo 1 > /proc/sys/vm/drop_caches

echo 2 > /proc/sys/vm/drop_caches

echo 3 > /proc/sys/vm/drop_caches

sync


Previous Comments:
------------------------------------------------------------------------
[2010-04-10 17:05:17] evilzluk at gmail dot com

Description:

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

The problem is the fread() uses a normal amount of a memory. But there
are too many unallocated anonymous memory pages.

So if the file size >2G the script may cause eating up to 2G of RAM. But
the script's runtime memory is 5M.



The problem is occured even if:

$fp = fopen($file, "rb");

while(!feof($fp))

    fread($fp, 1024);

fclose($fp);



After that the memory isn't released so we have a garbadge in the
memory.





Test script:

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

<?php



$file = "A.very.big.file.avi";

ob_start();

$fp = fopen($file, "rb");

if ($fp)

{

    while(!feof($fp))

    {

        echo(fread($fp, 1024));

        if (ob_get_length())

        {

            ob_flush();

            flush();

            ob_end_flush();

        }

    }

    fclose($fp);

}

@ob_flush();

@flush();

@ob_end_flush();

@ob_end_clean();



?>





Expected result:

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

The total amount of a memory usage should be at least <php script
runtime memory usage> + 1024 (+ some buffer (up to 8192)). But not
almost all the physical memory (0...unlimited)

------------------------------------------------------------------------
[2010-04-10 01:06:50] evilzluk at gmail dot com

Description:
------------
The problem is the fread() uses a normal amount of a memory. But there
are too many unallocated anonymous memory pages.

So if the file size >2G the script may cause eating up to 2G of RAM. But
the script's runtime memory is 5M.



The problem is occured even if:

$fp = fopen($file, "rb");

while(!feof($fp))

    fread($fp, 1024);

fclose($fp);



After that the memory isn't released so we have a garbadge in the
memory.



Test script:
---------------
<?php



$file = "A.very.big.file.avi";

ob_start();

$fp = fopen($file, "wb");

if ($fp)

{

    while(!feof($fp))

    {

        echo(fread($fp, 1024));

        if (ob_get_length())

        {

            ob_flush();

            flush();

            ob_end_flush();

        }

    }

    fclose($fp);



    @ob_flush();

    @flush();

    @ob_end_flush();

    @ob_end_clean();

}

?>



Expected result:
----------------
The total amount of a memory usage should be at least <php script
runtime memory usage> + 1024 (+ some buffer (up to 8192)). But not
almost all the physical memory (0...unlimited)







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



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

Reply via email to