linux - CLI里CURL访问某URL速度正常,PHP环境下却访问很慢?
情况是在一个PHP开发的web产品里,使用Guzzle6这个库作为HTTP Client来访问外部接口,现在发现访问外部接口时速度很慢,要15秒才能收到响应。而在CLI里直接CURL这个外部接口,响应是很快的。
自己试图解决这个问题,发现现象如下:
1.首先Guzzle应该也是使用CURL来访问的,这是从Guzzle偶尔报出的curl error中看出的。偶尔会出CURLE_COULDNT_RESOLVE_HOST这样的错误。
2.接着判断是不是DNS的问题,直接换用ip访问,结果是一样的。
3.接着试了两个CURL的两个选项,一个是超时设置,一个是考虑是不是IPV6的影响,对应到Guzzle分别是:
<code>['connect_timeout' => 2, 'curl' => [ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 ], ]</code>
依然没有变化。
4.将被访问接口host换成baidu,qq,taobao这些,发现此时大部分访问速度正常,qq除外。。也是很慢
5.访问时长目前看来都是15秒。最后对php-fpm进行strace,抽取出主要的内容如下:
<code>5519 22:30:08.260401 connect(7, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("121.xx.xx.xx")}, 16) = -1 EINPROGRESS (Operation now in progress) 5519 22:30:08.260744 clock_gettime(CLOCK_MONOTONIC, {278258, 519214625}) = 0 5519 22:30:08.260853 poll([{fd=7, events=POLLOUT|POLLWRNORM}], 1, 149999) = 1 ([{fd=7, revents=POLLOUT|POLLWRNORM}]) 5519 22:30:08.286791 getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 5519 22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 0 5519 22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 0 5519 22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 0 5519 22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 0 5519 22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 0 5519 22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 110 5519 22:30:08.287206 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:08.287248 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:08.287284 clock_gettime(CLOCK_MONOTONIC, {278258, 545716856}) = 0 5519 22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 0 5519 22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 0 5519 22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> .... 5519 22:30:09.288586 <... poll resumed> ) = 0 (Timeout) 5519 22:30:09.288678 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:09.288727 clock_gettime(CLOCK_MONOTONIC, {278259, 547161322}) = 0 5519 22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 0 5519 22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 0 5519 22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> ... 5519 22:30:10.289957 <... poll resumed> ) = 0 (Timeout) 5519 22:30:10.290024 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:10.290070 clock_gettime(CLOCK_MONOTONIC, {278260, 548504637}) = 0 5519 22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 0 5519 22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 0 5519 22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> ...一直持续到第15秒接受到响应 5519 22:30:23.309074 <... poll resumed> ) = 0 (Timeout) 5519 22:30:23.309151 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:23.309210 clock_gettime(CLOCK_MONOTONIC, {278273, 567644629}) = 0 5519 22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 0 5519 22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 0 5519 22:30:23.309324 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}]) 5519 22:30:23.386517 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}]) 5519 22:30:23.386578 recvfrom(7, "HTTP/1.1 200 OK\r\nServer: XXX"..., 16384, 0, NULL, NULL) = 1837 5519 22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0</...></unfinished></...></unfinished></...></unfinished></code>
请大家帮忙分析下出现原因可能是什么。
谢谢。
回复内容:
情况是在一个PHP开发的web产品里,使用Guzzle6这个库作为HTTP Client来访问外部接口,现在发现访问外部接口时速度很慢,要15秒才能收到响应。而在CLI里直接CURL这个外部接口,响应是很快的。
自己试图解决这个问题,发现现象如下:
1.首先Guzzle应该也是使用CURL来访问的,这是从Guzzle偶尔报出的curl error中看出的。偶尔会出CURLE_COULDNT_RESOLVE_HOST这样的错误。
2.接着判断是不是DNS的问题,直接换用ip访问,结果是一样的。
3.接着试了两个CURL的两个选项,一个是超时设置,一个是考虑是不是IPV6的影响,对应到Guzzle分别是:
<code>['connect_timeout' => 2, 'curl' => [ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 ], ]</code>
依然没有变化。
4.将被访问接口host换成baidu,qq,taobao这些,发现此时大部分访问速度正常,qq除外。。也是很慢
5.访问时长目前看来都是15秒。最后对php-fpm进行strace,抽取出主要的内容如下:
<code>5519 22:30:08.260401 connect(7, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("121.xx.xx.xx")}, 16) = -1 EINPROGRESS (Operation now in progress) 5519 22:30:08.260744 clock_gettime(CLOCK_MONOTONIC, {278258, 519214625}) = 0 5519 22:30:08.260853 poll([{fd=7, events=POLLOUT|POLLWRNORM}], 1, 149999) = 1 ([{fd=7, revents=POLLOUT|POLLWRNORM}]) 5519 22:30:08.286791 getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 5519 22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 0 5519 22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 0 5519 22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 0 5519 22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 0 5519 22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 0 5519 22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 110 5519 22:30:08.287206 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:08.287248 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:08.287284 clock_gettime(CLOCK_MONOTONIC, {278258, 545716856}) = 0 5519 22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 0 5519 22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 0 5519 22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> .... 5519 22:30:09.288586 <... poll resumed> ) = 0 (Timeout) 5519 22:30:09.288678 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:09.288727 clock_gettime(CLOCK_MONOTONIC, {278259, 547161322}) = 0 5519 22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 0 5519 22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 0 5519 22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> ... 5519 22:30:10.289957 <... poll resumed> ) = 0 (Timeout) 5519 22:30:10.290024 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:10.290070 clock_gettime(CLOCK_MONOTONIC, {278260, 548504637}) = 0 5519 22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 0 5519 22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 0 5519 22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 <unfinished ...> ...一直持续到第15秒接受到响应 5519 22:30:23.309074 <... poll resumed> ) = 0 (Timeout) 5519 22:30:23.309151 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) 5519 22:30:23.309210 clock_gettime(CLOCK_MONOTONIC, {278273, 567644629}) = 0 5519 22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 0 5519 22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 0 5519 22:30:23.309324 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}]) 5519 22:30:23.386517 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}]) 5519 22:30:23.386578 recvfrom(7, "HTTP/1.1 200 OK\r\nServer: XXX"..., 16384, 0, NULL, NULL) = 1837 5519 22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0</...></unfinished></...></unfinished></...></unfinished></code>
请大家帮忙分析下出现原因可能是什么。
谢谢。
如果需求不是太复杂的话还是自己封装一个简单的httpclient吧,这样去找一个第三方库的问题还是比较麻烦的,要么就用调试工具跑跑看
换个试下,直接用 curl访问看看速度

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

VS Code 系统要求:操作系统:Windows 10 及以上、macOS 10.12 及以上、Linux 发行版处理器:最低 1.6 GHz,推荐 2.0 GHz 及以上内存:最低 512 MB,推荐 4 GB 及以上存储空间:最低 250 MB,推荐 1 GB 及以上其他要求:稳定网络连接,Xorg/Wayland(Linux)

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。
