#30734 [Bgs]: stream_get_meta_data does not return the correct number of unread bytes
| From: | kormoc at gmail dot com | Date: | Tue, 09 Nov 2004 17:09:32 +0000 |
| Subject: | #30734 [Bgs]: stream_get_meta_data does not return the correct number of unread bytes | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-68853@lists.php.net to get a copy of this message | ||
ID: 30734
User updated by: kormoc at gmail dot com
Reported By: kormoc at gmail dot com
Status: Bogus
Bug Type: Sockets related
Operating System: Linux
PHP Version: 5.0.2
New Comment:
Actually, according to the docs here:
http://us2.php.net/manual/en/function.stream-get-meta-data.php
It does not tell you that, it says:
unread_bytes (int) - the number of bytes currently contained in the
read buffer.
Nothing about it shouldn't be used. Infact in the comments on the page,
they talk about a work around in PHP 4.x.
Could you please update the Documentation then to say this? Along with
any other varables that function returns that shouldn't be used?
Thanks
Previous Comments:
------------------------------------------------------------------------
[2004-11-09 17:06:01] wez@php.net
unread_bytes refers to the number of bytes in PHP's own internal
buffer.
You should not use this value in a script, as is stated in the
documentation.
------------------------------------------------------------------------
[2004-11-09 15:52:42] kormoc at gmail dot com
Description:
------------
For a stream in blocking or non blocking mode, stream_get_meta_data
does not return the correct number of unread bytes until it's been
'freshened' by a fread or similar.
For example, the test program.
The unread bytes will be 0, but if you insert a fgets($fp) above the
stream_get_meta_data line, it will return the correct number of bytes.
It also does this if blocking is set to false.
If you need any more information about my setup, feel free to ask, it's
really not that odd or special.
Thanks!
Reproduce code:
---------------
<?PHP
$fp=fsockopen("irc.freenode.net",6667);
stream_set_blocking($fp,TRUE);
fwrite($fp,"NICK BOOT\nUSER BOOT 0 * :BOOT\n\n");
$read=array($fp);
while(1) {
if(false===($num_changed_streams=stream_select($read,$write=NULL,$except=NULL,1)))
break;
else {
$data=stream_get_meta_data($fp);
print_r($data);
while($data['unread_bytes']>0) {
echo fgets($fp);
$data=stream_get_meta_data($fp);
}
}
}
fclose($fp);
?>
Expected result:
----------------
Something similar to this
kormoc@kormoc ~ $ php streamtest.php
NOTICE AUTH :*** Looking up your hostname...
Array
(
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
NOTICE AUTH :*** Found your hostname, welcome back
Array
(
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 77
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** No identd (auth) response
:sendak.freenode.net 432 BOOT :Erroneous Nickname
Array
(
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
Actual result:
--------------
Array
(
[stream_type] => tcp_socket/ssl
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)
(repeating forever)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=30734&edit=1