历史版本2:Client

向客户端发送数据,函数原型:

bool Server->send(mixed $fd, string $data, int $serverSocket = -1);

发送过程是异步的,底层会自动监听可写,将数据逐步发送给客户端

参数

  • $fd,客户端的文件描述符
  • $data,发送的数据,TCP协议最大不得超过2M,可修改 buffer_output_size 改变允许发送的最大包长度
  • $serverSocket,向Unix Socket DGRAM对端发送数据时需要此项参数,TCP客户端不需要填写

返回值

  • 发送成功会返回true
  • 发送失败会返回false,调用$server->getLastError()方法可以得到失败的错误码

安全性

  • send操作具有原子性,多个进程同时调用send向同一个TCP连接发送数据,不会发生数据混杂

长度限制

  • 如果要发送超过2M的数据,可以将数据写入临时文件,然后通过sendfile接口进行发送
  • 通过设置 buffer_output_size 参数可以修改发送长度的限制
  • 在发送超过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']);
});