Curl-VS-Guzzle 性能测试
这里项目围绕Curl 和 Guzzle这两个HTTP请求组件进行一些压力测试,看一下性能差距.我们围绕两个组件的连接复用情况来测试.(文章中会强调opcache的作用)
一. 测试阐述
- 测试curl和guzzle在连接复用情况下的性能差别 (guzzle不开启opcache)
- 测试curl和guzzle在连接复用情况下的性能差别 (guzzle开启opcache)
二. 性能测试过程
2.1 测试条件
- 在相同的Nginx,PHP,LibCurl库环境
- 测试脚本包含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 : 造成大量编译耗时)
2.5 Guzzle测试结果(复用连接-开启opcache : 消除编译耗时,性能很大提升)
2.6 Curl测试结果(复用连接-开启opcache)
三. 测试总结
Guzzle由于是PHP包,所以编译代码会消耗时间,但是开启了opcache后,性能不会造成太多损失,能够达到很好的运行性能.