Server->send
最后更新于:2022-04-02 06:20:15
# 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']);
});
~~~
';