日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

【PHP】循环 调用第三方API (curl ),性能优化

發布時間:2025/3/20 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 ),性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。