ID: 39961 User updated by: php_nospam at ramihyn dot sytes dot net Reported By: php_nospam at ramihyn dot sytes dot net Status: Bogus Bug Type: Streams related Operating System: Win32,Linux x86 PHP Version: 5.2.0 New Comment:
As a work-around, stream_copy_to_stream() can be used, which produces the expected result, but how would it be possible to copy the file content to a string variable using stream_copy_to_stream()? I guess it is the 3 lines of code in _php_stream_read() found in the ZEND API, which breaks the loop to avoid greedy read. What is that piece of code useful for, except for breaking fread()? I recommend to change the documentation for fread() to clarify it should be used with 8192 byte blocks at max to ensure it works as expected, which isnt stated at least in the german documentation. Previous Comments: ------------------------------------------------------------------------ [2006-12-27 12:04:47] php_nospam at ramihyn dot sytes dot net In fact, it looks like the return value of stream_eof() is ignored. ------------------------------------------------------------------------ [2006-12-27 11:58:02] php_nospam at ramihyn dot sytes dot net Thanks for marking this bug as "bogus". Would you please tell me, where this behaviour is documented? I cant find it. Think of it what you want, but this is not bogus. In my example script, there are 16399 bytes to read. fread() was told to read 16399 bytes. fread() calls the stream wrappers' stream_read() method only once, which only reads 8192 bytes. ------------------------------------------------------------------------ [2006-12-27 11:35:55] [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 ------------------------------------------------------------------------ [2006-12-27 11:24:42] php_nospam at ramihyn dot sytes dot net Description: ------------ PHP's fread() function reads only the first 8192 bytes of any file accessed via a stream wrapper, even if the file is bigger and the wrappers' stream_eof() method returns false to signal it is NOT the end of the file. I expect fread() to repeat calling the wrappers' stream_read() and stream_eof() methods until stream_eof() signals the end of file or stream_read() returns less than the requested 8192 bytes. I encountered this behaviour with PHP 5.2.0 on Win32 and Linux x86. Reproduce code: --------------- <? class PHP_Bug { private $data; private $pos; function initializeStream() { $this->data = str_repeat("-",16399); $this->pos = 0; } function stream_open($fn) { $this->initializeStream(); return true; } function stream_stat() { $this->initializeStream(); return array(0,0,0100444,"mode"=>0100444,"size"=>strlen($this->data)); } function url_stat() { return $this->stream_stat(); } function stream_read($cnt) { echo __METHOD__."(".$cnt.")\n"; $ret = substr($this->data,$this->pos,$cnt); $this->pos += strlen($ret); return $ret; } function stream_eof() { $ret = ($this->pos >= strlen($this->data)); echo __METHOD__."=".(($ret)?"true":"false")."\n"; return $ret; } } stream_wrapper_register("bug","PHP_Bug"); $fs = filesize("bug://"); $fp = fopen("bug://","r"); $ret = fread($fp,$fs); fclose($fp); echo "size is ".strlen($ret)."\n"; ?> Expected result: ---------------- PHP_Bug::stream_read(8192) PHP_Bug::stream_eof=false PHP_Bug::stream_read(8192) PHP_Bug::stream_eof=false PHP_Bug::stream_read(8192) PHP_Bug::stream_eof=true size is 16399 Actual result: -------------- PHP_Bug::stream_read(8192) PHP_Bug::stream_eof=false size is 8192 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39961&edit=1
