babytree/httpclient

There is no license information available for the latest version (1.0.0) of this package.

REAL async http/https client for php

1.0.0 2019-06-06 09:59 UTC

This package is auto-updated.

Last update: 2025-07-06 23:02:53 UTC


README

绝大部分互联网公司的php-fpm都跑在单进程单线程模式下,随着微服务架构的兴起,普通的curl已经不能满足复杂业务场景的需求。而curl_multi和guzzle尽管支持多个http请求的异步执行,但是它们的api对后端开发同学并不友好。

babytree/httpclient是宝宝树在复杂业务场景下积累的php http客户端。

特性

  • http请求和业务代码可以异步执行
  • 多个http请求可以异步执行
  • 满足psr规范
  • 比guzzle、curl_multi更友好的api
  • 经过了线上复杂业务场景的考验

其中,http请求和业务代码的异步执行,是curl_multi和guzzle所不支持的。使用httpclient,在复杂业务场景下,可以将总体代码运行时间进一步缩短,进而提高QPS。

依赖

  • php 7.0+
  • 如果要进行单元测试,需要安装phpunit和go

安装

composer require babytree/httpclient 1.0.0

使用方法

基础用法

use Babytree\HttpClient\Psr\RequestOptions;
use Babytree\HttpClient\RequestClient;

$options = array(
    // some options
);
$request_uniq = $request_client->addRequest($some_api, $options, RequestClient::MODE_ASYNC);
$ret = $request_client->getResponse($request_uniq);

// 对请求结果进行业务操作
// ...

业务逻辑和http请求异步

use Babytree\HttpClient\Psr\RequestOptions;
use Babytree\HttpClient\RequestClient;

$options = array(
    // some options
);
$request_uniq = $request_client->addRequest($some_api, $options, RequestClient::MODE_ASYNC);

// 这里可以放可以和请求并行处理的业务逻辑 
// some business code

$ret = $request_client->getResponse($request_uniq);

// 对请求结果进行业务操作
// ...

多个请求异步

use Babytree\HttpClient\Psr\RequestOptions;
use Babytree\HttpClient\RequestClient;

$request_client = new RequestClient();
$options = array(
    // some options
);
$multi_urls = array(
            $api1,
            $api2,
            $api3,
            ...
        );
$request_list = array();
foreach ($multi_urls as $url) {
    $request_uniq = $request_client->addRequest($url, $options, RequestClient::MODE_ASYNC);
    $request_list[$request_uniq] = $request_uniq;
}

// 这里可以放可以和请求并行处理的业务逻辑 
// some business code

do {
    $request_uniq = null;
    try {
        $ret = $request_client->selectGetAsyncResponse($request_uniq, null);
    } catch (\Exception $e) {
    }
    if ($request_uniq && isset($request_list[$request_uniq])) {
        unset($request_list[$request_uniq]);
    }
    if (!$request_list) {
        break;
    }
} while (true);

// 对请求结果进行业务操作
// ...

运行单元测试

phpunit tests ./

选项

$options = array(
	//请求超时时间
	RequestOptions::TIMEOUT => 3,
	//debug, $stream不指定时输出到标准设备
	RequestOptions::DEBUG  => $stream,
	//设置header
	RequestOptions::HEADERS => [
	        'timestamp'    => time() * 1000,
	        'signature'    => $signature,
	        'platform'     => 1,
	        'token'        => $meitun_token,
	    ],
	//代理
	RequestOptions::PROXY   => '172.16.99.239:8888',
	//post json格式 默认添加header 'Content-Type', 'application/json;charset=utf-8'
	RequestOptions::JSON => array(
	    'baby_id' => '11111',
	    'baby_name' => '对对对',
	    'baby_gender' => '',
	    ),
	//post form表单格式 默认添加header 'Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8'
	RequestOptions::FORM_PARAMS => array(
	    'baby_id' => '11111',
	    'baby_name' => '对对对',
	    'baby_gender' => '',
	    ),
	//post上传文件 默认添加header 'Content-Type', 'multipart/form-data; boundary='
	RequestOptions::MULTIPART => array(
	    'id'        => 1,
	    'user_id'   => 2,
	    'svg_file1' => '/home/baiwei/poster_backgroup.png',
	    'svg_file2' => '/home/baiwei/poster_event.png',
	    ),
);

范例

上传文件

$request_client = new RequestClient();

// 如要要测试,可以使用tests/server.go提供的上传功能来作为测试服务器
$server_url = "http://127.0.0.1:18888/upload";

$options = array(
        RequestOptions::DEBUG  => 1,
        RequestOptions::MULTIPART => array(
            'id'        => 1,
            'user_id'   => 2,
            'file' => '/home/baiwei/poster_backgroup.png',
            ),
        );
$request_uniq = $request_client->addRequest($server_url, $options, RequestClient::MODE_ASYNC);
$ret = $request_client->getResponse($request_uniq);
// 对请求结果进行处理
// ...