新版本的swoole,Client异步事件被移除了,协程Client该如何使用
各位高手,根据官方的建议是用协程Client,替代原来的Client异步事件。
官方的使用文档如下
use Swoole;
$client = new Coroutine\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
echo $client->recv();
$client->close();
这种用法只适合服务端能立马返回数据的场景。
假如服务端是不规律(时间无法确定)的向client发送数据,client需要被动等待服务端的数据,就只能用无限循环吗?如下
use Swoole;
$client = new Coroutine\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
while(1){//无限循环,等待服务端的数据
echo $client->recv();
}
这种用法会不会浪费资源,因为很多时候可能服务端没有发送数据,这样client就是在做无用的循环,有没有其他办法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
recv()在超时前是挂起协程的,挂起协程时候,是不占用CPU的
这只不过是没有包装一个和以前一样的API而已,如果给client增加一个方法,看起来和以前差不多了
这和服务器立马返回数据没有关系,这是你的需求问题,你只需要一条数据,那recv一次,你需要服务器返回的所有数据,你也不知道服务器什么时候回发数据,那就循环一直recv
事件循环解决的不是 电话响-接电话 这种逻辑流程问题,它解决的是 通知你电话响没响 的问题,事件循环往往是一个顶层的
while(1)
,轮训各种事件,触发了就执行回调