Curl-VS-Guzzle 性能测试

Posted by LB on Fri, Feb 22, 2019

Curl-VS-Guzzle 性能测试

这里项目围绕Curl 和 Guzzle这两个HTTP请求组件进行一些压力测试,看一下性能差距.我们围绕两个组件的连接复用情况来测试.(文章中会强调opcache的作用)

一. 测试阐述

  1. 测试curl和guzzle在连接复用情况下的性能差别 (guzzle不开启opcache)
  2. 测试curl和guzzle在连接复用情况下的性能差别  (guzzle开启opcache)

二. 性能测试过程

2.1 测试条件

  1. 在相同的Nginx,PHP,LibCurl库环境
  2. 测试脚本包含curl对象的复用,每次测试请求执行10次外部http请求

2.2 Guzzle测试代码 

 1//GuzzleClient.php
 2use \GuzzleHttp\Client;
 3class GuzzleClient
 4{
 5    protected static $guzzleClientConnection = null;
 6
 7    public static function getGuzzleClient($baseUrl, $persistent = true)
 8    {
 9        if (!$persistent || !self::$guzzleClientConnection) {
10            self::$guzzleClientConnection = new Client(['base_uri' => $baseUrl]);
11        }
12
13        return self::$guzzleClientConnection;
14    }
15
16}
17
18//get_loop_simple.php 内部循环调用多次
19for ($i=0;$i<10;$i++){
20    try {
21        //获取Client静态变量,复用curl单体
22        $client = GuzzleClient::getGuzzleClient("http://127.0.0.1");
23        $response = $client->request('GET', '/test.php');
24       // var_dump($response->getBody()->getContents());
25    } catch (\Exception $e) {
26        $error = $e->getMessage();
27        var_dump($error);
28    }
29}

2.3 Curl测试代码

 1class CurlClient
 2{
 3    protected static $curlClientConnection = null;
 4
 5    public static function getCurlClient($persistent = true)
 6    {
 7        if (!$persistent || !self::$curlClientConnection) {
 8            self::$curlClientConnection = curl_init();
 9        }
10
11        return self::$curlClientConnection;
12    }
13
14}
15
16//内部循环调用十次
17for ($i=0;$i<10;$i++){
18    try {
19        //获取Client静态变量,复用curl单体
20        $ch = CurlClient::getCurlClient();
21        curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1/test.php');
22
23        //return the transfer as a string
24        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
25        // $output contains the output string
26        $response = curl_exec($ch);
27        // var_dump($response);
28    } catch (\Exception $e) {
29        $error = $e->getMessage();
30        var_dump($error);
31    }
32}

2.4 Guzzle测试结果(复用连接-没有开启opcache : 造成大量编译耗时)

1550729123333

1550729222971

1550729248844

2.5 Guzzle测试结果(复用连接-开启opcache : 消除编译耗时,性能很大提升)

1550738223897

1550738243295

1550738257973

2.6 Curl测试结果(复用连接-开启opcache)

1550733358303

1550733380443

1550733436734

三. 测试总结

Guzzle由于是PHP包,所以编译代码会消耗时间,但是开启了opcache后,性能不会造成太多损失,能够达到很好的运行性能.