|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2004-11-09 17:06 UTC] wez@php.net
[2004-11-09 18:09 UTC] kormoc at gmail dot com
[2004-11-11 17:20 UTC] nlopess@php.net
[2020-02-07 06:11 UTC] phpdocbot@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 19 11:00:01 2025 UTC |
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)