Edit report at https://bugs.php.net/bug.php?id=61636&edit=1
ID: 61636 User updated by: kontrollfreak at arcor dot de Reported by: kontrollfreak at arcor dot de Summary: readfile() resp. fpassthru() try to allocate complete file into memory -Status: Feedback +Status: Open Type: Bug Package: Apache related Operating System: Windows XP SP3 PHP Version: master-Git-2012-04-05 (snap) Block user comment: N Private report: N New Comment: To be sure, I reran the test this morning under following conditions: --------------------------------------------------------------------- - Windows XP SP3 - Apache 2.4.4 from http://www.apachelounge.com/download/win32/binaries/httpd-2.4.4-win32.zip - PHP 5.4.14 from http://windows.php.net/downloads/releases/php-5.4.14-Win32-VC9-x86.zip httpd.conf: ----------- LoadModule authz_core_module modules/mod_authz_core.so LoadModule php5_module modules/php5apache2_4.dll Listen 80 LogLevel trace8 DocumentRoot htdocs <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> php.ini: -------- *empty* Test script: ------------ <?php error_reporting(-1); while(ob_get_level()) ob_end_flush(); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="test.bin"'); header('Content-Length: 209715200'); readfile('test.bin'); ?> Expected result: ---------------- A download of file "test.bin" containing 200 MB of NUL bytes Actual result: -------------- The result has changed. I do not get the out of memory error anymore. Instead Firefox 20.0.1 shows the following: The connection was reset The connection to the server was reset while the page was loading. Apache error.log: ----------------- [Mon Apr 15 09:03:29.719610 2013] [core:trace3] [pid 2588:tid 1884] core.c(3034): Setting LogLevel for all modules to trace8 [Mon Apr 15 09:03:29.749653 2013] [mpm_winnt:notice] [pid 2588:tid 1884] AH00455: Apache/2.4.4 (Win32) PHP/5.4.14 configured -- resuming normal operations [Mon Apr 15 09:03:29.749653 2013] [mpm_winnt:notice] [pid 2588:tid 1884] AH00456: Server built: Feb 23 2013 16:24:03 [Mon Apr 15 09:03:29.749653 2013] [core:notice] [pid 2588:tid 1884] AH00094: Command line: 'httpd -d C:/Apache24' [Mon Apr 15 09:03:29.759668 2013] [mpm_winnt:notice] [pid 2588:tid 1884] AH00418: Parent: Created child process 2576 [Mon Apr 15 09:03:29.759668 2013] [mpm_winnt:debug] [pid 2588:tid 1884] mpm_winnt.c(422): AH00402: Parent: Sent the scoreboard to the child [Mon Apr 15 09:03:30.230345 2013] [core:trace3] [pid 2576:tid 1868] core.c(3034): Setting LogLevel for all modules to trace8 [Mon Apr 15 09:03:30.280417 2013] [core:trace3] [pid 2576:tid 1868] core.c(3034): Setting LogLevel for all modules to trace8 [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2576:tid 1868] mpm_winnt.c(1708): AH00453: Child process is running [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2588:tid 1884] mpm_winnt.c(505): AH00408: Parent: Duplicating socket 1892 (0.0.0.0:80) and sending it to child process 2576 [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2588:tid 1884] mpm_winnt.c(524): AH00411: Parent: Sent 1 listeners to child 2576 [Mon Apr 15 09:03:30.300445 2013] [core:trace4] [pid 2588:tid 1884] mpm_common.c(526): mpm child 2576 (gen 0/slot 0) started [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2576:tid 1868] mpm_winnt.c(343): AH00391: Child: Retrieved our scoreboard from the parent. [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2576:tid 1868] mpm_winnt.c(458): AH00403: Child: Waiting for data for listening socket 0.0.0.0:80 [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2576:tid 1868] mpm_winnt.c(483): AH00407: Child: retrieved 1 listeners from parent [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:debug] [pid 2576:tid 1868] child.c(955): AH00352: Child: Acquired the start mutex. [Mon Apr 15 09:03:30.300445 2013] [mpm_winnt:notice] [pid 2576:tid 1868] AH00354: Child: Starting 64 worker threads. [Mon Apr 15 09:03:30.310460 2013] [mpm_winnt:debug] [pid 2576:tid 1252] child.c(354): AH00334: Child: Accept thread listening on 0.0.0.0:80 using AcceptFilter data [Mon Apr 15 09:03:33.444967 2013] [core:trace5] [pid 2576:tid 1260] protocol.c(622): [client 127.0.0.1:1146] Request received from client: GET /test.php HTTP/1.1 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(300): [client 127.0.0.1:1146] Headers received from client: [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Host: localhost [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Accept-Language: en-US,en;q=0.5 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Accept-Encoding: gzip, deflate [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Connection: keep-alive [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_request.c(303): [client 127.0.0.1:1146] Cache-Control: max-age=0 [Mon Apr 15 09:03:33.444967 2013] [authz_core:debug] [pid 2576:tid 1260] mod_authz_core.c(827): [client 127.0.0.1:1146] AH01628: authorization result: granted (no directives) [Mon Apr 15 09:03:33.444967 2013] [core:trace3] [pid 2576:tid 1260] request.c(225): [client 127.0.0.1:1146] request authorized without authentication by access_checker_ex hook: /test.php [Mon Apr 15 09:03:33.444967 2013] [http:trace3] [pid 2576:tid 1260] http_filters.c(960): [client 127.0.0.1:1146] Response sent with status 200, headers: [Mon Apr 15 09:03:33.444967 2013] [http:trace5] [pid 2576:tid 1260] http_filters.c(969): [client 127.0.0.1:1146] Date: Mon, 15 Apr 2013 07:03:33 GMT [Mon Apr 15 09:03:33.444967 2013] [http:trace5] [pid 2576:tid 1260] http_filters.c(972): [client 127.0.0.1:1146] Server: Apache/2.4.4 (Win32) PHP/5.4.14 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] X-Powered-By: PHP/5.4.14 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] Content-Disposition: attachment; filename=\\"test.bin\\" [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] Content-Length: 209715200 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] Keep-Alive: timeout=5, max=100 [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] Connection: Keep-Alive [Mon Apr 15 09:03:33.444967 2013] [http:trace4] [pid 2576:tid 1260] http_filters.c(804): [client 127.0.0.1:1146] Content-Type: application/octet-stream [Mon Apr 15 09:03:33.444967 2013] [core:trace6] [pid 2576:tid 1260] core_filters.c(523): [client 127.0.0.1:1146] core_output_filter: flushing because of THRESHOLD_MAX_BUFFER Previous Comments: ------------------------------------------------------------------------ [2013-04-15 04:21:19] paj...@php.net And you still got the out of memory error? ------------------------------------------------------------------------ [2013-04-14 13:59:28] kontrollfreak at arcor dot de In reply to [2013-04-14 12:55 UTC] paj...@php.net: During the test output buffering was disabled by the following snippet. Disable output buffering: ------------------------- <?php while (ob_get_level()) ob_end_flush(); ?> ------------------------------------------------------------------------ [2013-04-14 12:55:29] paj...@php.net Be sure to disable output buffering, see http://www.php.net/readfile ------------------------------------------------------------------------ [2013-04-14 11:18:29] kontrollfreak at arcor dot de (Windows only) kv3981 at gmail dot com's solution works as long as the transfer does not take longer than max_execution_time. ------------------------------------------------------------------------ [2013-02-10 20:00:53] fredericg_99 at yahoo dot fr I can confirm that the problem exists on PHP 5.3.16. However, the problem does not appear for every files, but once it appears on a file, it applies for every attempts on that file (and not necessarily for the others). The proposed workaround works. ------------------------------------------------------------------------ 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 https://bugs.php.net/bug.php?id=61636 -- Edit this bug report at https://bugs.php.net/bug.php?id=61636&edit=1