swoole_server->send
向客户端发送数据,函数原型:
bool swoole_server->send(int $fd, string $data, int $from_id = 0);
- $data,发送的数据。TCP协议最大不得超过2M,UDP协议不得超过64K
- 发送成功会返回true,如果连接已被关闭或发送失败会返回false
例子:
<?php $serv = new swoole_server("0.0.0.0", 9501); $serv->set(array( 'worker_num' => 2, 'dispatch_mode' => 3, 'daemonize' => false, 'log_file' => '/tmp/swoole.log' )); $serv->on('start', function($serv) { echo 'start',PHP_EOL; }); $serv->on('workerStart', function($serv, $worker_id) { echo "server start\n"; }); $serv->on('connect', function ($serv, $fd, $from_id){ echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Connect.\n"; }); $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { echo "[#".$serv->worker_id."]\tClient[$fd]: $data\n"; $serv->send($fd, json_encode(array("hello" => '1213', "bat" => "ab")).PHP_EOL); $serv->close($fd); }); $serv->on('close', function ($serv, $fd, $from_id) { echo "[#".posix_getpid()."]\tClient@[$fd:$from_id]: Close.\n"; }); $serv->start();
TCP服务器
- send操作具有原子性,多个进程同时调用send向同一个连接发送数据,不会发生数据混杂
- 如果要发送超过2M的数据,可以将数据写入临时文件,然后通过sendfile接口进行发送
swoole-1.6以上版本不需要$from_id
UDP服务器
- send操作会直接在worker进程内发送数据包,不会再经过主进程转发
- 使用fd保存客户端IP,from_id保存from_fd和port
- 如果在onReceive后立即向客户端发送数据,可以不传$from_id
- 如果向其他UDP客户端发送数据,必须要传入from_id
- 在外网服务中发送超过64K的数据会分成多个传输单元进行发送,如果其中一个单元丢包,会导致整个包被丢弃。所以外网服务,建议发送1.5K以下的数据包