swoole 高手之路
  • Introduction
  • 简介
  • 入门安装
    • php7 安装
    • swoole 安装
    • ide 提示工具安装
  • 原理概念
    • 需要掌握的基础知识
    • IO 模型
    • TCP 与 UDP
    • TCP 粘包处理
    • 同步 与 异步
    • 进程 与 线程
    • Swoole进程结构
    • swoole的运行模式
    • swoole编程注意事项
    • Socket原理
    • Libevent
  • swoole 基础
    • 网络通信引擎
      • 创建TCP服务器
      • 创建TCP客户端
      • 创建UDP服务器
      • 创建HTTP服务器
      • 创建websocket服务器
    • 异步非堵塞IO
      • 异步文件系统IO
      • 异步Mysql
      • 异步Redis
      • 异步Http/WebSocket客户端
    • 进程 内存 协程
      • swoole进程管理模块
      • swoole 内存操作模块
      • swoole 协程
    • Task进程异步任务
    • 毫秒定时器
  • swoole 高级特性
    • 心跳检测
    • 守护进程、信号和平滑重启
    • mysql连接池
  • swoole 其他
    • nginx+swoole
    • 结合传统框架
  • swoole RPC调用
  • 附录 : 其他资料
    • Zan Extension
    • 资料
Powered by GitBook
On this page

Was this helpful?

  1. swoole 基础
  2. 异步非堵塞IO

异步Http/WebSocket客户端

Previous异步RedisNext进程 内存 协程

Last updated 5 years ago

Was this helpful?

建议先阅读官方文档章节

一、为什么需要异步

通常我们进行 http 请求都是通过 curl 或者 file_get_contents,但是并发的性能都不好,都是同步执行,需要等待请求执行完成才能执行下一步操作,Swoole 内置的 swoole_http_client(Http 异步客户端)没有并发限制,当你的程序读取网络或磁盘时。swoole会加入到事件监听中,完全不需要等待,你的代码可以取做别的事情。当网络或磁盘读取完成,返回数据时,再继续向下执行你的代码。

二、异步Http/WebSocket客户端

1、默认发送get及post请求

$host如果为域名底层需要进行一次DNS查询才能得到ip地址,这是阻塞IO,所以使用`Swoole\Async::dnsLookup`实现异步非阻塞
<?php
//dns解析
Swoole\Async::dnsLookup("www.baidu.com", function ($domainName, $ip) {

    $client = new swoole_http_client($ip, 80);
   //设置请求头
    $client->setHeaders([
        'Accept' => 'text/html,application/xhtml+xml,application/xml',
        'Accept-Encoding' => 'gzip',
    ]);

    //发送get请求
    $client->get('/', function ($cli) {
        echo "Length: " . strlen($cli->body) . "\n";
        echo $cli->body;
    });
});

echo '是不是同步执行';

2、自定义请求类型

$client = new swoole_http_client('218.64.129.244', 9500);
//设置请求头
$client->setHeaders([
    'Accept' => 'text/html,application/xhtml+xml,application/xml',
    'Accept-Encoding' => 'gzip',
]);

//自定义请求类型 PUT
$client->setMethod('PUT');
$client->setData(['name'=>'peter']);
$client->execute('/',function ($cli){
    var_dump($cli);

});

3.http请求改造升级为websocket

通过upgrade方法发起WebSocket握手请求,并将连接升级为WebSocket

<?php

$client = new swoole_http_client('218.64.129.244', 9500);

//监听服务端给我们发送的数据
$client->on('message',function ($cli,$frame){
    var_dump($frame);
});

//websocket建立的是一个长连接
$client->upgrade('/',function ($cli){
    $cli->push('hello world');
});
异步Http/WebSocket客户端