× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Client->recv

此方法用于从服务器端接收数据。函数原型为:

function Client->recv(int $size = 65535, int $flags = 0) : string | false

参数

  • $size,接收数据的缓存区最大长度,此参数不要设置过大,否则会占用较大内存
  • flags,可设置额外的参数,如Client::MSG_WAITALL是否等待所有数据到达后返回

MSG_WAITALL

  • 如果设定了Client::MSG_WAITALL参数就必须设定准确的$size,否则会一直等待,直到接收的数据长度达到$size
  • 未设置Client::MSG_WAITALL时,$size最大为64K
  • 如果设置了错误的$size,会导致recv超时,返回 false

MSG_PEEK

窥视数据,不会从缓存区中清空,下一次调用recv时依然会读取到。

返回值

  • 成功收到数据返回字符串
  • 连接关闭返回空字符串
  • 失败返回 false,并设置$client->errCode属性

EOF/Length

客户端启用了EOF/Length检测后,无需设置$size和$waitall参数。扩展层会返回完整的数据包或者返回false

  • 当收到错误的包头或包头中长度值超过package_max_length设置时,recv会返回空字符串,PHP代码中应当关闭此连接

  • 程序猿始终不够

    recv是否支持在碰到换行符时自动返回?

  • shukean

    能不能在错误时不出php warning ...

  • 杨泽涛

    你可以在代码最前面 error_reporting(0)

  • 杨泽涛

    有必要么,你在接受到数据判断一下就好,然后返回了,数据还是会全部到你网卡去的

  • 007

    $size:接收数据的最大长度,这个参数不管用,设置大了也那样,总是需要多次 recv

  • DST暖冬

    遇到同样问题,需要启用第二参数 1,但是第一参数需要知道准确的大小;如果不是自己可控的服务的话,这个完全无法使用;recv 无法准确判断数据流是否已经终止了~ 如果遇到这情形,貌似只能回归 socket 了

  • DST暖冬

    期望可以准确判断读取的数据流是否结束了,且不需要收到过多的服务端限制;目前这个使用需要诸多方面的配合才可以正常使用

  • 环游世界

    recv超时时间是否可以设置,默认是多少?

  • 邓鸿风

    recv 当服务端返回数据过大的时候,client有时候只能获取到部分数据,为什么啊

  • 十五年+安分

    这个是在timeout后才从缓冲区读取数据的吗?,感觉timeout,跟socket没差别啊[泪]

  • 李强

    clinet recv Segmentation fault 什么鬼.. 'open_eof_check' => true, 'package_eof' => $this->eof, 'package_max_length' => 1024 * 1024*2, 'socket_buffer_size' => 1024 * 1024 * 2,

  • 傅雨

    这是阻塞调用的??

  • reluctance_virus

    PHP Warning: Swoole\Client::recv(): recv() failed. Error: Resource temporarily unavailable [11] in /usr/share/nginx/html/socket/WebSocketClient.php on line 115 如何解决?

  • 守後

    同上recv failed

  • 铅笔

    能不能在错误时不出php warning ...直接返回 false不就好了。。warning。。。

  • 技术

    同志们注意: (未设置$waitall=true时,$size最大为64K) 也就是说如果数据超过64K,即使用了EOF方式,也必须设置第二个参数为true.

    此时第一个参数怎么办呢?填一个无穷大的数吧

  • 大眼刚哥

    环境Swoole version: 2.0.8 PHP version: 7.1.9 等待数据也返回空字符串呢?有没有遇到的

  • 贝克汉狼

    Error: Resource temporarily unavailable

  • waken

    楼上错误的: swoole_client->__construct(int $sock_type, int $is_sync = SWOOLE_SOCK_SYNC, string $key); 异步的改为同步的就可以了

  • 红客

    @十五年+安分 当然可以设置超时,我们可以使用swoole_client_select 来监听socket在指定时间内有无返回如果返回大于0则为正常如果小于0则为失败

  • 红客

    当然还需要做错误码检查防止被信号中断

  • 13764985678

    你们是怎么模拟a服务器向b服务器发送数据的呀,发送了, b服务器接收,怎么编写呀?这个demo实例怎么模拟