【PHP】循环 调用第三方API (curl ),性能优化
生活随笔
收集整理的這篇文章主要介紹了
【PHP】循环 调用第三方API (curl ),性能优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面說到:shell 腳本獲取設備多網口IPv4或IPv6地址,并且推送到pushgateway
PHP 應用中獲取IP地址多個網口循環,請求prometheus API 成了問題,很耗性能,為了優化性能,找到了 curl_multi_* 可以解決這種問題
curl_multi_init 是 并行地處理批處理cURL
說明:由于是在本地進行開發測試,所以響應時間 很長。請不要杠
之前的寫法:public function getIPAddr($val){$value = [];$infArr = explode(',', [xx,xx,xx,xx,xx,xx,xx,......]); // 數組長度:20$mac = $this->mac_addr;foreach ($infArr as $inf) {$four1 = \Prometheus::getValByQuery("ip4_{$inf}_1{mac=~'{$mac}'}");$four2 = \Prometheus::getValByQuery("ip4_{$inf}_2{mac=~'{$mac}'}");$four3 = \Prometheus::getValByQuery("ip4_{$inf}_3{mac=~'{$mac}'}");$four4 = \Prometheus::getValByQuery("ip4_{$inf}_4{mac=~'{$mac}'}");$ipv4 = "{$four1}.{$four2}.{$four3}.{$four4}";('0.0.0.0' != $ipv4) && $value[] = "{$inf}_{$ipv4}";$six1 = \Prometheus::getValByQuery("ip6_{$inf}_1{mac=~'{$mac}'}");$six2 = \Prometheus::getValByQuery("ip6_{$inf}_2{mac=~'{$mac}'}");$six3 = \Prometheus::getValByQuery("ip6_{$inf}_3{mac=~'{$mac}'}");$six4 = \Prometheus::getValByQuery("ip6_{$inf}_4{mac=~'{$mac}'}");$six5 = \Prometheus::getValByQuery("ip6_{$inf}_5{mac=~'{$mac}'}");$six6 = \Prometheus::getValByQuery("ip6_{$inf}_6{mac=~'{$mac}'}");$six7 = \Prometheus::getValByQuery("ip6_{$inf}_7{mac=~'{$mac}'}");$six8 = \Prometheus::getValByQuery("ip6_{$inf}_8{mac=~'{$mac}'}");$standard = base_convert($six1, 10, 16) . ':';$standard .= base_convert($six2, 10, 16) . ':';$standard .= base_convert($six3, 10, 16) . ':';$standard .= base_convert($six4, 10, 16) . ':';$standard .= base_convert($six5, 10, 16) . ':';$standard .= base_convert($six6, 10, 16) . ':';$standard .= base_convert($six7, 10, 16) . ':';$standard .= base_convert($six8, 10, 16);$ipv6 = inet_ntop(inet_pton($standard));("::" != $ipv6) && $value[] = "{$inf}_{$ipv6}";}$res = implode("<br>", $value);return $res ?: $val;}安裝上述同步方法,開發環境總響應時間達到 3.3min (存在網絡延時情況)
線上響應時間 5s 左右
單循環請求結果:33s
性能優化
使用curl_multi_* 之后 , 詳見 multiRequest
public function getWanipAttribute($val){$value = [];$infArr = explode(',', [xx,xx,xx,xx,xx,xx,xx,......]); // 數組長度:20$mac = $this->mac_addr;foreach ($infArr as $inf) {$ipArr = \Prometheus::getIpByQuery(["ip4_{$inf}_1{mac=~'{$mac}'}","ip4_{$inf}_2{mac=~'{$mac}'}","ip4_{$inf}_3{mac=~'{$mac}'}","ip4_{$inf}_4{mac=~'{$mac}'}","ip6_{$inf}_1{mac=~'{$mac}'}","ip6_{$inf}_2{mac=~'{$mac}'}","ip6_{$inf}_3{mac=~'{$mac}'}","ip6_{$inf}_4{mac=~'{$mac}'}","ip6_{$inf}_5{mac=~'{$mac}'}","ip6_{$inf}_6{mac=~'{$mac}'}","ip6_{$inf}_7{mac=~'{$mac}'}","ip6_{$inf}_8{mac=~'{$mac}'}",]);$four1 = $ipArr['0'];$four2 = $ipArr['1'];$four3 = $ipArr['2'];$four4 = $ipArr['3'];$ipv4 = "{$four1}.{$four2}.{$four3}.{$four4}";('0.0.0.0' != $ipv4) && $value[] = "{$inf}_{$ipv4}";$six1 = $ipArr['4'];$six2 = $ipArr['5'];$six3 = $ipArr['6'];$six4 = $ipArr['7'];$six5 = $ipArr['8'];$six6 = $ipArr['9'];$six7 = $ipArr['10'];$six8 = $ipArr['11'];unset($ipArr);$standard = base_convert($six1, 10, 16) . ':';$standard .= base_convert($six2, 10, 16) . ':';$standard .= base_convert($six3, 10, 16) . ':';$standard .= base_convert($six4, 10, 16) . ':';$standard .= base_convert($six5, 10, 16) . ':';$standard .= base_convert($six6, 10, 16) . ':';$standard .= base_convert($six7, 10, 16) . ':';$standard .= base_convert($six8, 10, 16);$ipv6 = inet_ntop(inet_pton($standard));("::" != $ipv6) && $value[] = "{$inf}_{$ipv6}";}$res = implode("<br>", $value);return $res ?: $val;}public static function getIpByQuery($query = [], $time = ''){$requestUrl = config("prometheus.url") . "api/v1/query?";$time = $time ? $time : date('Y-m-d\TH:i:s\Z');$data = [];$result = [];if (is_array($query)) {foreach ($query as $q) {$data[] = $requestUrl . "query={$q}&time={$time}";}$prometheusRes = multiRequest($data);foreach ($prometheusRes as $pv) {$responseArr = self::responseMsg($pv);$result[] = !empty($responseArr->data->result) ? $responseArr->data->result[0]->value[1] : 0;}}return $result;}總響應時間 25s 左右(與優化前同樣的開發環境)
單循環請求結果:2.8s
可以說 curl_multi_*,詳見function example 響應時間提升了10 倍左右。
其他的
上述響應時間通過:
$s = microtime(true); var_dump("開始:{$s}");foreach ($infArr as $inf) { .......todo }$e = microtime(true); var_dump("結束:{$e}"); $q = $e - $s; var_dump("開始-結束:{$q}"); var_dump('---------'); exit;總結
以上是生活随笔為你收集整理的【PHP】循环 调用第三方API (curl ),性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PHP】多线程请求 curl_mul
- 下一篇: 【PHP】常用日期函数