使用方法和 Client 同步模式方法完全一致,Coroutine\Client 的所有涉及网络请求的方法,Swoole 都会进行协程调度,业务层无需感知,connect 超时设置同时作用于 Connect 和 Recv、Send 超时;Swoole\Client提供的方法均可在 Coroutine\Client 中使用
use Swoole\Coroutine\Client;
use function Swoole\Coroutine\run;
run(function () {
$client = new Client(SWOOLE_SOCK_TCP);
// 设置客户端参数
$client->set([
'timeout' => 10,//总超时,包括连接、发送、接收所有超时
'connect_timeout' => 10,//连接超时
'read_timeout' => 10,//接收超时
'write_timeout' => 10,//发送超时
]);
// 连接到远程服务器,connect 连接失败后,不可直接进行重连。
// 必须使用close关闭已有socket,然后再进行connect重试
if (!$client->connect($host, $port, $timeout = 0.5)) {
//$timeout 网络 IO 的超时时间;包括 connect/send/recv,超时发生时,连接会被自动 close
echo "connect failed. Error: {$client->errCode}\n";
//关闭连接
$client->close();
//重试
$client->connect('127.0.0.1', 9501);
}
// 判断连接状态,表示客户端已连接,但是不一定可用(成功send或recv)
// 执行send或recv时应用层与内核发生交互,才能得到真实的连接可用状态。
if ($client->isConnected()) {
// 向服务端发送字符串数据,支持二进制数据,返回发送数据的长度
$client->send($data);
// 从服务器端接收数据
// 设置了通信协议,recv会返回完整的数据,长度受限于package_max_length
// 未设置通信协议,recv最大返回64K数据
// 返回空字符串表示服务端主动关闭连接,需要close;
// 失败,返回false
$client->recv(float $timeout = 0);
}
// 返回socket缓冲区中的数据,无数据时返回返回false
$client->peek(int $length = 65535);
});