× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Coroutine\Http\Client

协程版Http客户端基于原生的异步Http客户端,基本的设置和使用方法和异步Http客户端一致,不在需要注册回调函数,只需要同步写法即可,使用方法和Swoole\Http\Client一致的此处不再列出,请参考 swoole\AsyncIO\异步Http/WebSocket客户端,对于使用有区别的函数,此处单独说明

协程版Http客户端的底层用纯C编写,不依赖任何第三方扩展库,拥有超高的性能。

  • 支持Http-ChunkKeep-Alive特性,支持form-data格式
  • Http协议版本为HTTP/1.1
  • 支持升级为WebSocket客户端
  • gzip压缩格式支持需要依赖zlib
  • 支持setDefer特性,请参考并发Client

客户端仅实现核心的功能,实际项目建议使用 Saber

构造方法

function Swoole\Coroutine\Http\Client->__construct(string $host, int port, bool $ssl = false);
  • $host 目标服务器主机地址,可以为IP或域名,底层自动进行域名解析
  • $port 目标服务器的端口,一般http80https443
  • $ssl 是否启用SSL/TLS隧道加密,如果目标服务器是https必须设置$ssl参数为true

使用实例

$cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
$cli->setHeaders([
    'Host' => "localhost",
    "User-Agent" => 'Chrome/49.0.2587.3',
    'Accept' => 'text/html,application/xhtml+xml,application/xml',
    'Accept-Encoding' => 'gzip',
]);
$cli->set([ 'timeout' => 1]);
$cli->get('/index.php');
echo $cli->body;
$cli->close();
  • 如果未设置timeout,则将底层connectrequest超时设置为默认的500ms

Saber - 人性化的协程HTTP客户端封装库

开发者可使用已封装的协程HTTP客户端Saber

  • 基于Swoole协程Client开发
  • 人性化使用风格, ajax.js/axios.js/requests.py用户福音, 同时支持PSR风格操作
  • 浏览器级别完备的Cookie管理机制, 完美适配爬虫/API代理应用
  • 请求/响应/异常拦截器
  • 多请求并发, 并发重定向优化
  • 连接池, 自动化复用长连接
  • 通道池(Chan): 最大连接数限制+无阻塞
  • HTTPS连接, CA证书自动化支持
  • HTTP/Socks5 Proxy支持
  • WebSocket连接支持
  • 毫秒级超时定时器
  • 自动化 编码请求/解析响应 数据
  • 响应报文自动编码转换
  • 异步超大文件上传/下载, 断点重传
  • 自动重试机制
  • 单次并发数控制
  • 多模式/超细粒度异常处理机制

  • 家辉

    怎么使用代理服务器?

  • 西海木頭

    $cli->set([ 'timeout' => 1]); timeout 的单位是什么,秒or毫秒?

  • alvin

    超时是秒

  • can

    websocket的例子有吗? HTTP/WebSocket Client:Swoole\Coroutine\HTTP\Client

  • 活着

    上面那段代码我for 发现是顺序执行的 加上go 好像才可以 真是奇怪了

  • 周朗

    swoole编译的时候开启了openssl,但是发起请求的时候报错 WARNING swSSL_connect: SSL_connect(fd=7) failed. Error: (null)[1|0] $ssl 设置为true了,请求地址是https://xxx.xxx.xxx,这种报错是什么问题导致的啊

  • ↘侵蚀の目光

    Saber真挺好用的,幸好在马上开始要手撸连接池的前一刻发现了这个项目,省了很多事

  • ↘侵蚀の目光

    composer中国镜像(就是百度第一个那个)的最后同步时间是2018/7/17 下午10:51:36 saber是在这之后发布上composer的,所以要换其他镜像才能正常require下来,可以使用这个: composer config -g repo.packagist composer https://packagist.laravel-china.org

  • twosee

    composer中国镜像已经凉了, 建议用楼上的laravel的镜像源

  • 你咋又偷看我

    message:[Swoole\Coroutine\Http\Client::__construct(): require openssl library.] post HTTPS时会报这个错 但是openssl和php的openssl扩展都安装好的了 swoole version 4.2.1 php version 7.2.1 这是什么原因

  • 15921079089

    回复楼上 有的swoole 项目代码是不能编译 ssl的,建议更换swoole 源码为release版本.

  • 15219109756

    $cli = new Swoole\Coroutine\Http\Client('https://www.qiushibaike.com', 80, true); go(function () use ($cli) { $cli->get("/imgrank/"); var_dump($cli); echo socket_strerror($cli->errCode), PHP_EOL; var_dump($cli->body); }); 提示error Operation not permitted body无输出 网上还找不到解决方法

  • 13262732358

    $this->client = new \Co\http\Client("www.xxx.cn", 9501); wss能链接上但是发消息收不到。 改成ipws就可以了为啥呢

  • 13262732358

    websocket无法传参数new \Co\http\Client("www.xxx.cn?token=32233232", 9501,true)

  • 13262732358

    Swoole\Client::send() 连接失败 会报错。 有什么函数能在这之前判断下是否连接成功然后在调用send发送

  • 18975810121

    文档不详细,这里的所有代码都要放在go(function() use ($xxx){ // 代码放在这里 })