swoole_server->send [编辑本页]

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

bool swoole_server->send(int $fd, string $data, int $reactorThreadId = 0);
  • $data,发送的数据。TCP协议最大不得超过2M,UDP协议不得超过64K
  • 发送成功会返回true
  • 发送失败会返回false,调用$server->getLastError()方法可以得到失败的错误码

TCP服务器

  • send操作具有原子性,多个进程同时调用send向同一个连接发送数据,不会发生数据混杂
  • 如果要发送超过2M的数据,可以将数据写入临时文件,然后通过sendfile接口进行发送
  • 通过设置buffer_output_size参数可以修改发送长度的限制
  • 在发送超过8K的数据时,底层会启用Worker进程的共享内存,需要进行一次Mutex->lock操作
  • 当Worker进程的管道缓存区已满时,发送8K数据将启用临时文件存储

swoole-1.6以上版本不需要$reactorThreadId

UDP服务器

  • send操作会直接在worker进程内发送数据包,不会再经过主进程转发
  • 使用fd保存客户端IP,from_id保存from_fd和port
  • 如果在onReceive后立即向客户端发送数据,可以不传$from_id
  • 如果向其他UDP客户端发送数据,必须要传入from_id
  • 在外网服务中发送超过64K的数据会分成多个传输单元进行发送,如果其中一个单元丢包,会导致整个包被丢弃。所以外网服务,建议发送1.5K以下的数据包