Client [编辑本页]

swoole_client提供了tcp/udp socket的客户端的封装代码,使用时仅需 new swoole_client 即可。 swoolesocket client对比PHP提供的stream族函数有哪些好处:

  • stream函数存在超时设置的陷阱和Bug,一旦没处理好会导致Server端长时间阻塞
  • fread有8192长度限制,无法支持UDP的大包
  • swoole_client支持waitall,在知道包长度的情况下可以一次取完,不必循环取。
  • swoole_client支持UDP connect,解决了UDP串包问题
  • swoole_client是纯C的代码,专门处理socket,stream函数非常复杂。swoole_client性能更好

除了普通的同步阻塞+select的使用方法外,swoole_client还支持异步非阻塞回调。

同步阻塞客户端

$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, -1))
{
    exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
echo $client->recv();
$client->close();

php-fpm/apache环境下只能使用同步客户端
apache环境下仅支持prefork多进程模式,不支持prework多线程

异步非阻塞客户端

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on("connect", function(swoole_client $cli) {
    $cli->send("GET / HTTP/1.1\r\n\r\n");
});
$client->on("receive", function(swoole_client $cli, $data){
    echo "Receive: $data";
    $cli->send(str_repeat('A', 100)."\n");
    sleep(1);
});
$client->on("error", function(swoole_client $cli){
    echo "error\n";
});
$client->on("close", function(swoole_client $cli){
    echo "Connection close\n";
});
$client->connect('127.0.0.1', 9501);

异步客户端只能使用在cli命令行环境


  • 赵雁鹏

    文档链接都报错了

  • test

    Swoole_client 如何发送HTTP 请求?

  • 杨泽涛

    加个http头就可以了,浏览器不也是这么搞的么

  • 剧透爱好者xsir

    如果用http多,最好还是包一层http请求。。。一直加http头太麻烦

  • 無聊小站

    循环创建多个 swoole_client 进行 http 请求,只有一个会成功返回?

  • bjlzt

    异步请求,收到数据了,但一直hang在那儿,不用die和exit怎么退出来

  • DenoFiend

    连接池呢?

  • bengo

    failed. Error: Operation now in progress[115]. 这是怎么回事,请教一下大神

  • jimma

    是否支持SSL SOCKET / SERVERSOCKET

  • chd

    我到目前都不知道client运行在什么地方啊,

  • php mysql web开发

    运行在apache下又不能fork紫禁城,框架要改,是想推翻业务吗,怎么用到底怎么用,我就是想用cli方式多进程使用http实现comet技术,不用websocket,动不动就websocket,就是想用cli多进程节省服务器资源来实现反向ajax

  • 乔丹的弟弟

    在同步模式中遇到一个问题,就是client超时了,但是server端还是发送来了数据,暂定叫数据A,由于是长连接,下次请求recv的时候接收到的是数据A,而不是对应的数据B,也就是说请求包和接受包无法对应起来,不知道有什么成熟的解决方案吗

  • FMX

    Fatal error: swoole_client::__construct(): cannot use async-io in task process.

  • FMX

    如果在前端系统中,想在http_server中的task中把数据传递给另外几台服务器,想使用$client->send($data); 可是client不能在异步的IO中来使用, 那么该如何来进行处理?求教

  • FMX

    已处理,能用的,当时是初始化采用了配置文件的形式,导致类型问题,发生底层错误

  • 陈乐

    可以在发送数据的时候带上sign签名,接受到数据的时候验证sign来解决吗?

  • jm晨风

    swoole_client() 怎么向swoole_wesocket_client()上发送消息,为什么连接成功发送不消息??

  • smallbaby

    提示下$client->send("hello world\n"); 一定要加\n结束符,不然$client->recv()收不到信息,因为连接被client端主动关闭了... 14:15:36.416437 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [S], seq 334586130, win 29200, options [mss 1460,sackOK,TS val 3693691 ecr 0,nop,wscale 7], length 0 14:15:36.424940 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [S.], seq 3232096174, ack 334586131, win 65535, options [mss 1460,sackOK,TS val 2822591 ecr 3693691,nop,wscale 6], length 0 14:15:36.424977 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [.], ack 1, win 229, options [nop,nop,TS val 3693693 ecr 2822591], length 0 14:15:36.425064 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [P.], seq 1:11, ack 1, win 229, options [nop,nop,TS val 3693693 ecr 2822591], length 10 14:15:36.428558 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [.], ack 11, win 1358, options [nop,nop,TS val 2822592 ecr 3693693], length 0 14:15:36.923899 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [F.], seq 11, ack 1, win 229, options [nop,nop,TS val 3693818 ecr 2822592], length 0 14:15:36.932284 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [P.], seq 1:8, ack 12, win 1358, options [nop,nop,TS val 2822693 ecr 3693818], length 7 14:15:36.932330 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [R], seq 334586142, win 0, length 0 14:15:36.932336 IP 10.10.10.145.7392 > 10.10.10.13.56057: Flags [F.], seq 8, ack 12, win 1358, options [nop,nop,TS val 2822693 ecr 3693818], length 0 14:15:36.932343 IP 10.10.10.13.56057 > 10.10.10.145.7392: Flags [R], seq 334586142, win 0, length 0

    10.10.10.13 为client 10.10.10.145为server(未安装swoole)

  • 伍超

    [toto飘过]

  • lovejocky

    swoole_client异步连接成功后,如果是服务端主动关闭是可以实时触发onClose事件回调的,可是如果是网络出现了问题(比如说关闭网络),为什么不能立即触发onclose函数?环境为mac + php7 + swoole-1.8.11,有没有遇到同样问题的?

  • 陈玲

    在使用nginx做代理服务器时,能不能使用异步客户端swoole_client

  • 吴坎利

    怎么直接退出不监听了???

  • 王建民

    发送心跳包 每次发送前判断下 该连接是否在线

  • longmon

    网络关闭这种异常导致TCP连接的四次挥手失败,客户或服务端都不能马上得知连接断开

  • longmon

    连接未完成,正在尝试连接。多发生于异步连接,其实这不是一个错误,只是一个连接状态,表示正在进行连接 ,程序应该稍后检查连接状态

  • 李明

    receive client无法触发?