【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】常用日期函数