欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

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

发布时间:2025/3/20 php 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【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 ),性能优化的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。