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

Reply via email to