2014-12-07 87 views
0

我有一个连接到使用PHP套接字的telnet服务器的问题。我有一个完成的telnet类,但在我的另一台服务器上,该类不工作,因为stream_get_meta_data unread_bytes值。 PHP是否改变了5.4版本?我找不到这个改变。PHP unread_bytes在PHP 5.3中工作,但不在PHP 5.4

,我使用的代码:

 $buff = ''; 
     while (!feof($this->socket)) { 
      $buff .= fread($this->socket, 1024); 
      $stream_meta_data = stream_get_meta_data($this->socket); 
      if ($stream_meta_data['unread_bytes'] <= 0) 
       break; 
     } 

谁能帮助我或者说我,我可以改变什么?

+0

欢迎来到2014年,PHP 5.3不再支持,PHP 5.4几乎不支持,大家和他们的母亲建议您升级到PHP 5.6或至少PHP 5.5。至于文档:'​​unread_bytes:你不应该在脚本中使用这个值。' – 2014-12-07 19:15:58

+0

好吧,它是内部缓冲区..所以......没有保证实际上可以读取的内容。单独的'feof()'不适合你吗? – Wrikken 2014-12-07 19:17:18

+0

感谢Debian,最新版本是PHP 5.4.x! feof()不能正常工作。有什么建议么? – Aredon 2014-12-07 19:22:47

回答

0

你没有清楚说明您的代码段是应该做的:

  1. 读取字节,直到套接字连接被关闭,或
  2. 可用的时刻读取的字节,在实时连接。

但您的评论FEOF()不正常工作建议你2之后,因为feof()检查将1就足够了;比照从WEZ到“不存在错误” unread_bytes always 0注释:

unread_bytes是残留在PHP的缓冲层 最后一次读取后的字节数。
如果您在先前的读取中使用了来自缓冲区 的所有数据,unread_bytes将保持为零,直到您再次从网络读取一块数据 。
因此,unread_bytes不应该是 用于确定是否有更多数据未决;你应该使用:

  • feof()检测文件结束。 不要忘了你可以在这里使用非阻塞模式。
  • PHP 4.3有一个新函数 被称为stream_select(),它的行为类似于套接字扩展套接字的socket_select(),但对fopen()和 fsockopen()返回的所有文件起作用。您可以使用它来测试哪些文件已准备好用于读取/写入 并指定超时。
  • 所以,如果你想要2.,你可以使用stream_select()socket_select()

    相关问题