linux - CLI裡CURL訪問某URL速度正常,PHP環境下卻訪問很慢?

來源:互聯網
上載者:User
關鍵字 php linux guzzle strace curl
情況是在一個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分別是:

['connect_timeout' => 2, 'curl' => [        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4  ],]

依然沒有變化。

4.將被提供者host換成baidu,qq,taobao這些,發現此時大部分訪問速度正常,qq除外。。也是很慢

5.訪問時間長度目前看來都是15秒。最後對php-fpm進行strace,抽取出主要的內容如下:

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}) = 05519  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]) = 05519  22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 05519  22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 05519  22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 05519  22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 05519  22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 05519  22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 1105519  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}) = 05519  22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 05519  22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 05519  22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ....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}) = 05519  22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 05519  22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 05519  22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...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}) = 05519  22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 05519  22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 05519  22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...一直持續到第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}) = 05519  22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 05519  22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 05519  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) = 18375519  22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0

請大家幫忙分析下出現原因可能是什麼。
謝謝。

回複內容:

情況是在一個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分別是:

['connect_timeout' => 2, 'curl' => [        CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4  ],]

依然沒有變化。

4.將被提供者host換成baidu,qq,taobao這些,發現此時大部分訪問速度正常,qq除外。。也是很慢

5.訪問時間長度目前看來都是15秒。最後對php-fpm進行strace,抽取出主要的內容如下:

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}) = 05519  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]) = 05519  22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 05519  22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 05519  22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 05519  22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 05519  22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 05519  22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 1105519  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}) = 05519  22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 05519  22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 05519  22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ....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}) = 05519  22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 05519  22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 05519  22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...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}) = 05519  22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 05519  22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 05519  22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...一直持續到第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}) = 05519  22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 05519  22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 05519  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) = 18375519  22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0

請大家幫忙分析下出現原因可能是什麼。
謝謝。

如果需求不是太複雜的話還是自己封裝一個簡單的httpclient吧,這樣去找一個第三方庫的問題還是比較麻煩的,要麼就用調試工具跑跑看

換個試下,直接用 curl訪問看看速度

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.