ID: 30936 User updated by: jason at e7x dot com Reported By: jason at e7x dot com Status: Bogus Bug Type: Filesystem function related Operating System: Windows 2000/Linux PHP Version: 4.3.9 New Comment:
I'm afraid I still don't see the relevance of that sentence. Surely "up to" does not mean it may stop reading at any point for no apparent reason. Maybe I'm not explaining this very well. Or maybe I've completely missed the point of streams. Looking in the source (not that I really understand what I'm looking at) for 4.3.9 and comparing to 4.3.8, this looks suspicious: main/streams.c line 656-658: /* just break anyway, to avoid greedy read */ if (stream->wrapper != &php_plain_files_wrapper) break; This is not in the source 4.3.8 (which worked as expected). If I understand correctly is what prevents reading more than what may already be in the buffer plus the next buffered chunk (so summary is wrong, fread($f,1); fread($f,20000) the second will return 16383 bytes (if available)). I guess the issue is why a greedy read should be bad here and not anywhere else. It's not worth arguing about. I can read in smaller chunks and stick them together as I go, but maybe the second warning on the fread manual page should be expanded to include stream wrappers. Previous Comments: ------------------------------------------------------------------------ [2004-11-30 08:41:57] [EMAIL PROTECTED] http://ch.php.net/manual/en/function.fread.php First paragraph: "fread() reads up to length bytes from the file pointer referenced by handle." ------------------------------------------------------------------------ [2004-11-30 00:27:43] jason at e7x dot com Length bytes have not been read and EOF was not reached, this is not a network stream. In the example code there *are* 15000 bytes available to read. Regular file system functions, compress.zlib (didn't try other builtin streams) and PHP <= 4.3.8 have no problem reading more than 8192 bytes in one hit. I can't find any reference to an 8192 limit anywhere in the manual. ------------------------------------------------------------------------ [2004-11-29 23:24:45] [EMAIL PROTECTED] 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 http://php.net/fread says: fread() reads up to length bytes from the file pointer referenced by handle note the \"up to\". ------------------------------------------------------------------------ [2004-11-29 22:47:45] jason at e7x dot com Description: ------------ Attempting to fread() more than 8192 bytes from a userspace stream wrapper will only read and return the first 8192 bytes, putting an echo statement in stream_read() shows that it is only being called once. Reading <= 8192 bytes at a time works as expected, as does fgets($f, 15000) (reads 14999 bytes). This bug is only present in 4.3.9 and 4.3.10RC1, 4.3.8 works fine. Reproduce code: --------------- <?php // using example class from the manual: // http://uk.php.net/stream_wrapper_register $x = str_repeat('x', 15000); $f = fopen('var://x', 'r'); $len = strlen(fread($f, 15000)); fclose($f); echo "Read $len bytes"; ?> Expected result: ---------------- Read 15000 bytes Actual result: -------------- Read 8192 bytes ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=30936&edit=1