最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Swoole v4.6.5 版本发布,增加原生curl multi支持

    正文概述 转载于:掘金(沈唁)   2021-04-10   572

    v4.6.5 版本没有向下不兼容改动,主要对原生 curl hook 进行了一些增强,支持了 curl multi

    • 支持原生 curl multi

    使用原生 curl hook 的前提是在编译 Swoole 扩展时开启--enable-swoole-curl选项

    可以使用以下代码进行测试:

    use Swoole\Runtime;
    use function Swoole\Coroutine\run;
    
    Runtime::enableCoroutine(SWOOLE_HOOK_NATIVE_CURL);
    run(function () {
        $ch1 = curl_init();
        $ch2 = curl_init();
    
        // 设置URL和相应的选项
        curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");
        curl_setopt($ch1, CURLOPT_HEADER, 0);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
    
        curl_setopt($ch2, CURLOPT_URL, "http://www.gov.cn/");
        curl_setopt($ch2, CURLOPT_HEADER, 0);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
    
        $mh = curl_multi_init();
    
        curl_multi_add_handle($mh, $ch1);
        curl_multi_add_handle($mh, $ch2);
    
        $active = null;
        // 执行批处理句柄
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    
        while ($active && $mrc == CURLM_OK) {
            $n = curl_multi_select($mh);
            if ($n != -1) {
                do {
                    $mrc = curl_multi_exec($mh, $active);
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }
    
        $info1 = curl_multi_info_read($mh);
        $info2 = curl_multi_info_read($mh);
        $info3 = curl_multi_info_read($mh);
    
        assert($info1['msg'] === CURLMSG_DONE);
        assert($info2['msg'] === CURLMSG_DONE);
        assert($info3 === false);
    
        assert(strpos(curl_multi_getcontent($ch1),'baidu.com') !== false);
        assert(strpos(curl_multi_getcontent($ch2),'中央人民政府门户网站') !== false);
    
        curl_multi_remove_handle($mh, $ch1);
        curl_multi_remove_handle($mh, $ch2);
    
        curl_multi_close($mh);
    });
    

    支持 curl multi 之后,也就间接的支持了 Guzzle,无需更改任何代码,即可支持。

    include __DIR__ . '/vendor/autoload.php';
    
    use Swoole\Coroutine\Barrier;
    use Swoole\Runtime;
    use GuzzleHttp\Client;
    use GuzzleHttp\Promise;
    
    use function Swoole\Coroutine\run;
    use function Swoole\Coroutine\go;
    
    Runtime::enableCoroutine(SWOOLE_HOOK_NATIVE_CURL);
    
    const N = 4;
    
    run(function () {
        $barrier = Barrier::make();
        $result = [];
        go(function () use ($barrier, &$result) {
            $client = new Client();
            $promises = [
                'baidu' => $client->getAsync('http://www.baidu.com/'),
                'qq' => $client->getAsync('https://www.qq.com/'),
                'gov' => $client->getAsync('http://www.gov.cn/')
            ];
            $responses = Promise\Utils::unwrap($promises);
            assert(strpos($responses['baidu']->getBody(),'百度') !== false);
            assert(strpos(iconv('gbk', 'utf-8', $responses['qq']->getBody()),'腾讯') !== false);
            assert(strpos($responses['gov']->getBody(),'中华人民共和国') !== false);
            $result['task_1'] = 'OK';
        });
    
        go(function () use ($barrier, &$result) {
            $client = new Client(['base_uri' => 'http://httpbin.org/']);
            $n = N;
            $data = $promises = [];
            while ($n--) {
                $key = 'req_' . $n;
                $data[$key] = uniqid('swoole_test');
                $promises[$key] = $client->getAsync('/base64/' . base64_encode($data[$key]));
            }
            $responses = Promise\Utils::unwrap($promises);
    
            $n = N;
            while ($n--) {
                $key = 'req_' . $n;
                assert($responses[$key]->getBody() === $data[$key]);
            }
            $result['task_2'] = 'OK';
        });
    
        Barrier::wait($barrier);
        assert($result['task_1'] === 'OK');
        assert($result['task_2'] === 'OK');
        echo 'Done' . php_EOL;
    });
    

    同时也还添加了一些 Guzzle 的单元测试。

    • 允许在使用 HTTP/2 的 Response 中使用数组设置 headers

    v4.6.0 版本开始 Swoole\Http\Response 支持重复设置相同 $keyHTTP 头,并且 $value 支持多种类型,如 arrayobjectintfloat,底层会进行 toString 转换,并且会移除末尾的空格以及换行。

    但是未支持 HTTP/2 的,详情见 issue #4133

    在此版本中也进行了支持:

    $http = new Swoole\Http\Server('127.0.0.1', 9501);
    $http->set(['open_http2_protocol' => true]);
    
    $http->on('request', function ($request, $response) {
        $response->header('Test-Value', [
            "a\r\n",
            'd5678',
            "e  \n ",
            null,
            5678,
            3.1415926,
        ]);
    
        $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
    });
    $http->start();
    

    可以使用以上代码进行测试,并使用 curl 命令进行测试结果

    $ curl --http2-prior-knowledge -v http://localhost:9501
    *   Trying ::1...
    * TCP_NODELAY set
    * Connection failed
    * connect to ::1 port 9501 failed: Connection refused
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * Connected to localhost (127.0.0.1) port 9501 (#0)
    * Using HTTP2, server supports multi-use
    * Connection state changed (HTTP/2 confirmed)
    * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
    * Using Stream ID: 1 (easy handle 0x7fe9e9009200)
    > GET / HTTP/2
    > Host: localhost:9501
    > User-Agent: curl/7.64.1
    > Accept: */*
    >
    * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
    < HTTP/2 200
    < test-value: a
    < test-value: d5678
    < test-value: e
    < test-value: 5678
    < test-value: 3.1415926
    < server: swoole-http-server
    < date: Fri, 09 Apr 2021 11:04:39 GMT
    < content-type: text/html
    < content-length: 28
    <
    * Connection #0 to host localhost left intact
    <h1>Hello Swoole. #6944</h1>* Closing connection 0
    

    更新日志

    下面是完整的更新日志:

    新增 API

    • 在 WaitGroup 中增加 count 方法(swoole/library#100) (@sy-records) (@deminy)

    增强

    • 支持原生 curl multi (#4093) (#4099) (#4101) (#4105) (#4113) (#4121) (#4147) (swoole/swoole-src@cd7f51c) (@matyhtf) (@sy-records) (@huanghantao)
    • 允许在使用 HTTP/2 的 Response 中使用数组设置 headers

    修复

    • 修复 NetBSD 构建 (#4080) (@devnexen)
    • 修复 OpenBSD 构建 (#4108) (@devnexen)
    • 修复 illumos/solaris 构建,只有成员别名 (#4109) (@devnexen)
    • 修复握手未完成时,SSL 连接的心跳检测不生效 (#4114) (@matyhtf)
    • 修复 Http\Client 使用代理时host中存在host:port产生的错误 (#4124) (@Yurunsoft)
    • 修复 Swoole\Coroutine\Http::request 中 header 和 cookie 的设置 (swoole/library#103) (@leocavalcante) (@deminy)

    内核

    • 支持 BSD 上的 asm context (#4082) (@devnexen)
    • 在 FreeBSD 下使用 arc4random_buf 来实现 getrandom (#4096) (@devnexen)
    • 优化 darwin arm64 context:删除 workaround 使用 label (#4127) (@devnexen)

    测试

    • 添加 alpine 的构建脚本 (#4104) (@limingxinleo)

    原文首发自Swoole问答社区:《Swoole v4.6.5 版本发布,增加原生curl multi支持》


    起源地下载网 » Swoole v4.6.5 版本发布,增加原生curl multi支持

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元