ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
**socket_read**(resource **$socket**,int **$length** [,int **$type** = PHP_BINARY_READ] ) :string -- 从已连接的socket接收数据 配对:socket\_wirte、socket\_read(一次性读写) socket\_read、socket\_recv、socket\_accept三个默认都是阻塞的 当客户端socket_connect请求服务端,服务端socket_accept接受后,他们之间就可以通信了 socket_read就是用来接受对方发送的内容 第二个参数就是设置接受数据的最大字节 第三个参数设置接受数据的方式: * **`PHP_BINARY_READ`**(Default) - 使用system的 **recv()** 函数。 安全读取二进制数据 * **`PHP_NORMAL_READ`**\- 在\\n或者\\r处结束读取. >[danger]如果是PHP_NORMAL_READ模式,其实行为和socket_recv是一样的,都是用的系统的recv函数 socket_read返回的是数据而socket_recv返回的是数据的字节数,数据却在第二个参数 socket_recv支持多种flag,用于不同场景 根据socket_recv的返回值可以检测socket关闭的情况(例如对端关闭了socket) >* \>0 表示接收到的字节数; >* ===0, 发生了错误,socket closed; >* ===false,无数据,socket not closed。 而socket_read只返回空字符串或者字符串,无法判断无数据还是关闭了socket 两者具体用法: ``` while( $str = socket_recv($socket, ……) ){ $arr[] = $str; } 或者: $str = socket_read($socket, $len); // 一次性接收完,丢弃超过 $len 的数据 ```