php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #31763 Memory leak on file dowloading when using sessions?
Submitted: 2005-01-30 12:10 UTC Modified: 2005-01-30 18:21 UTC
From: adyzah at hotmail dot com Assigned:
Status: Not a bug Package: Apache related
PHP Version: 4.3.10 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: adyzah at hotmail dot com
New email:
PHP Version: OS:

 

 [2005-01-30 12:10 UTC] adyzah at hotmail dot com
Description:
------------
I am testing the following code that pushes a file to the browser 
(Linux + Apache 1.3 + PHP 4.3.10 but tested also under several other configs)

!!!!!!
Try it with a BIG test1.zip (e.g. 100M in size)

Try it with wget http://server/test.php or a browser but the result is more accurate when using wget since in browsers could work if you already had a succesfull download of a smaller file.
!!!!!!

What i discovered is that if i keep the 2 session initialisation functions
the script will work ONLY if the allocated memory in php.ini is greater than the size
of the tested file. If i remove the session functions the script works fine
even if the test1.zip file is very big (hundreds of Megs)

Reproduce code:
---------------
<?php
session_save_path('/tmp');
session_start();
$sFileName = 'test1.zip';
$sFileDir = '/var/www/html/';
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment;filename=\"" . $sFileName . "\"");
header("Content-Length: " . filesize($sFileDir . $sFileName));
header('Pragma: cache');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Connection: close');
header('Expires: ' . date('r', time()+60*60));
header('Last-Modified: ' . date('r', time()));
$oFp = fopen($sFileDir . $sFileName, "rb");
$iReadBufferSize = 512;
while (!feof($oFp)) {
        echo fread ($oFp, $iReadBufferSize);
}
fclose ($oFp);
exit;
?>

Expected result:
----------------
The file should dowload via a browser or via wget

Actual result:
--------------
tail from apache error_log:

Allowed memory size of 12582912 bytes exhausted (tried to allocate 10240 bytes)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-01-30 17:11 UTC] iliaa@php.net
Do you have session.use_trans_sid  enabled?
 [2005-01-30 18:00 UTC] adyzah at hotmail dot com
Yes, is set to 1. And indeed if i set it to 0 it works. But i am not sure if i can set it to 0 :(

Btw: from my observations if i put memory limit 200M and try to download a 150M file, judging from the delayed response, seems that the php engine tries to buffer all content, which is abnormal. Session initialisation should have to affect headers and not content.

Thanks,

Adrian Zaharia
 [2005-01-30 18:12 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

When that option is turned on the output is being buffered in memory causing the memory problem you are seeing.
 [2005-01-30 18:13 UTC] johannes@php.net
When session.use_trans_sid?is on the output is bufferd to 
rewrite Links in the content to hold the session id. 
 [2005-01-30 18:21 UTC] adyzah at hotmail dot com
Thanks for the info.

However, the ideea of caching all seems a bit risky :(

Adrian
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 28 04:01:28 2024 UTC