企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# swoole_server->send 向客户端发送数据,函数原型: ```php bool swoole_server->send(int $fd, string $data, int $extraData = 0); ``` * `$data`,发送的数据,TCP协议最大不得超过`2M`,可修改 [buffer_output_size](https://wiki.swoole.com/wiki/page/p-buffer_output_size.html) 改变允许发送的最大包长度 * UDP协议不得超过`65507`,`UDP`包头占`8`字节, `IP`包头占`20`字节,`65535-28 = 65507` * UDP服务器使用`$fd`保存客户端IP,`$extraData`保存`server_fd`和`port` * 发送成功会返回`true` * 发送失败会返回`false`,调用`$server->getLastError()`方法可以得到失败的错误码 TCP服务器 ----- * `send`操作具有原子性,多个进程同时调用`send`向同一个`TCP`连接发送数据,不会发生数据混杂 * 如果要发送超过`2M`的数据,可以将数据写入临时文件,然后通过`sendfile`接口进行发送 * 通过设置 [buffer_output_size](https://wiki.swoole.com/wiki/page/p-buffer_output_size.html) 参数可以修改发送长度的限制 * 在发送超过`8K`的数据时,底层会启用`Worker`进程的共享内存,需要进行一次`Mutex->lock`操作 * 当`Worker`进程的管道缓存区已满时,发送`8K`数据将启用临时文件存储 * 不需要关心客户端的带宽,底层会自动监听可写,将数据逐步发送给客户端 * 如果连续向同一个客户端发送大量数据,可能会导致`Socket`内存缓存区塞满,底层会立即返回`false`,应用程序可以调整`socket_buffer_size`设置,或 将数据保存到磁盘,等待客户端收完已发送的数据后再进行发送 > `TCP`客户端发送数据,不需要`$extraData`参数 UDP服务器 ----- * `send`操作会直接在`Worker`进程内发送数据包,不会再经过主进程转发 * 如果在`onReceive`后立即向客户端发送数据,可以不传`$extraData` * 如果向其他`UDP`客户端发送数据,必须要传入`$extraData` * 在外网服务中发送超过`64K`的数据会分成多个传输单元进行发送,如果其中一个单元丢包,会导致整个包被丢弃。所以外网服务,建议发送`1.5K`以下的数据包