🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Server->send [TOC] 向客户端发送数据,函数原型: ~~~ bool Server->send(mixed $fd, string $data, int $serverSocket = -1); ~~~ 发送过程是异步的,底层会自动监听可写,将数据逐步发送给客户端 ## 参数 * `$fd`,客户端的文件描述符 * `$data`,发送的数据,`TCP`协议最大不得超过`2M`,可修改[buffer\_output\_size](buffer\_output\_size.md)改变允许发送的最大包长度 * `$serverSocket`,向`Unix Socket DGRAM`对端发送数据时需要此项参数,`TCP`客户端不需要填写 ## 返回值 * 发送成功会返回`true` * 发送失败会返回`false`,调用`$server->getLastError()`方法可以得到失败的错误码 ## 安全性 * `send`操作具有原子性,多个进程同时调用`send`向同一个`TCP`连接发送数据,不会发生数据混杂 ## 长度限制 * 如果要发送超过`2M`的数据,可以将数据写入临时文件,然后通过`sendfile`接口进行发送 * 通过设置[buffer\_output\_size](buffer\_output\_size.md)参数可以修改发送长度的限制 * 在发送超过`8K`的数据时,底层会启用`Worker`进程的共享内存,需要进行一次`Mutex->lock`操作 ## 缓存区 * 当`Worker`进程的管道缓存区已满时,发送`8K`数据将启用临时文件存储 * 如果连续向同一个客户端发送大量数据,可能会导致`Socket`内存缓存区塞满,底层会立即返回`false`,应用程序可以调整`socket_buffer_size`设置,或 将数据保存到磁盘,等待客户端收完已发送的数据后再进行发送 ## 协程调度 在协程模式下`send`遇到缓存区已满时会自动挂起,当触发`onBufferEmpty`时恢复协程,继续发送数据。 ## UnixSocket 监听`UnixSocket DGRAM`端口时,可以使用`send`向对端发送数据。 ~~~ $serv->on("packet", function (Swoole\Server $serv, $data, $addr) { $serv->send($addr['address'], 'SUCCESS', $addr['server_socket']); }); ~~~