Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial php linux - CLI里CURL访问某URL速度正常,PHP环境下却访问很慢?

linux - CLI里CURL访问某URL速度正常,PHP环境下却访问很慢?

Jun 06, 2016 pm 08:11 PM
curl guzzle linux 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>
Salin selepas log masuk
Salin selepas log masuk

依然没有变化。

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>
Salin selepas log masuk
Salin selepas log masuk

请大家帮忙分析下出现原因可能是什么。
谢谢。

回复内容:

情况是在一个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>
Salin selepas log masuk
Salin selepas log masuk

依然没有变化。

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>
Salin selepas log masuk
Salin selepas log masuk

请大家帮忙分析下出现原因可能是什么。
谢谢。

如果需求不是太复杂的话还是自己封装一个简单的httpclient吧,这样去找一个第三方库的问题还是比较麻烦的,要么就用调试工具跑跑看

换个试下,直接用 curl访问看看速度

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP: Pengenalan kepada bahasa skrip sisi pelayan PHP: Pengenalan kepada bahasa skrip sisi pelayan Apr 16, 2025 am 12:18 AM

PHP adalah bahasa skrip sisi pelayan yang digunakan untuk pembangunan web dinamik dan aplikasi sisi pelayan. 1.Php adalah bahasa yang ditafsirkan yang tidak memerlukan kompilasi dan sesuai untuk perkembangan pesat. 2. Kod PHP tertanam dalam HTML, menjadikannya mudah untuk membangunkan laman web. 3. PHP memproses logik sisi pelayan, menghasilkan output HTML, dan menyokong interaksi pengguna dan pemprosesan data. 4. PHP boleh berinteraksi dengan pangkalan data, penyerahan borang proses, dan melaksanakan tugas-tugas sampingan pelayan.

PHP dan Python: Paradigma yang berbeza dijelaskan PHP dan Python: Paradigma yang berbeza dijelaskan Apr 18, 2025 am 12:26 AM

PHP terutamanya pengaturcaraan prosedur, tetapi juga menyokong pengaturcaraan berorientasikan objek (OOP); Python menyokong pelbagai paradigma, termasuk pengaturcaraan OOP, fungsional dan prosedur. PHP sesuai untuk pembangunan web, dan Python sesuai untuk pelbagai aplikasi seperti analisis data dan pembelajaran mesin.

Konfigurasi komputer apa yang diperlukan untuk vscode Konfigurasi komputer apa yang diperlukan untuk vscode Apr 15, 2025 pm 09:48 PM

Keperluan Sistem Kod Vs: Sistem Operasi: Windows 10 dan ke atas, MACOS 10.12 dan ke atas, pemproses pengedaran Linux: minimum 1.6 GHz, disyorkan 2.0 GHz dan ke atas memori: minimum 512 MB, disyorkan 4 GB dan ke atas ruang penyimpanan: minimum 250 mb, disyorkan 1 GB dan di atas keperluan lain:

Memilih antara php dan python: panduan Memilih antara php dan python: panduan Apr 18, 2025 am 12:24 AM

PHP sesuai untuk pembangunan web dan prototaip pesat, dan Python sesuai untuk sains data dan pembelajaran mesin. 1.Php digunakan untuk pembangunan web dinamik, dengan sintaks mudah dan sesuai untuk pembangunan pesat. 2. Python mempunyai sintaks ringkas, sesuai untuk pelbagai bidang, dan mempunyai ekosistem perpustakaan yang kuat.

PHP vs Python: Gunakan Kes dan Aplikasi PHP vs Python: Gunakan Kes dan Aplikasi Apr 17, 2025 am 12:23 AM

PHP sesuai untuk pembangunan web dan sistem pengurusan kandungan, dan Python sesuai untuk sains data, pembelajaran mesin dan skrip automasi. 1.PHP berfungsi dengan baik dalam membina laman web dan aplikasi yang cepat dan berskala dan biasanya digunakan dalam CMS seperti WordPress. 2. Python telah melakukan yang luar biasa dalam bidang sains data dan pembelajaran mesin, dengan perpustakaan yang kaya seperti numpy dan tensorflow.

Mengapa menggunakan PHP? Kelebihan dan faedah dijelaskan Mengapa menggunakan PHP? Kelebihan dan faedah dijelaskan Apr 16, 2025 am 12:16 AM

Manfaat utama PHP termasuk kemudahan pembelajaran, sokongan pembangunan web yang kukuh, perpustakaan dan kerangka yang kaya, prestasi tinggi dan skalabilitas, keserasian silang platform, dan keberkesanan kos. 1) mudah dipelajari dan digunakan, sesuai untuk pemula; 2) integrasi yang baik dengan pelayan web dan menyokong pelbagai pangkalan data; 3) mempunyai rangka kerja yang kuat seperti Laravel; 4) Prestasi tinggi dapat dicapai melalui pengoptimuman; 5) menyokong pelbagai sistem operasi; 6) Sumber terbuka untuk mengurangkan kos pembangunan.

Impak PHP: Pembangunan Web dan seterusnya Impak PHP: Pembangunan Web dan seterusnya Apr 18, 2025 am 12:10 AM

Phphassignificantelympactedwebdevelopmentandextendsbeyondit.1) itpowersmajorplatformslikeworderpressandexcelsindatabaseIntions.2) php'SadaptabilityAldoStoScaleforlargeapplicationFrameworksLikelara.3)

PHP dan Web: Meneroka kesan jangka panjangnya PHP dan Web: Meneroka kesan jangka panjangnya Apr 16, 2025 am 12:17 AM

PHP telah membentuk rangkaian sejak beberapa dekad yang lalu dan akan terus memainkan peranan penting dalam pembangunan web. 1) PHP berasal pada tahun 1994 dan telah menjadi pilihan pertama bagi pemaju kerana kemudahan penggunaannya dan integrasi lancar dengan MySQL. 2) Fungsi terasnya termasuk menghasilkan kandungan dinamik dan mengintegrasikan dengan pangkalan data, yang membolehkan laman web dikemas kini secara real time dan dipaparkan secara peribadi. 3) Aplikasi dan ekosistem PHP yang luas telah mendorong kesan jangka panjangnya, tetapi ia juga menghadapi kemas kini versi dan cabaran keselamatan. 4) Penambahbaikan prestasi dalam beberapa tahun kebelakangan ini, seperti pembebasan Php7, membolehkannya bersaing dengan bahasa moden. 5) Pada masa akan datang, PHP perlu menangani cabaran baru seperti kontena dan microservices, tetapi fleksibiliti dan komuniti aktif menjadikannya boleh disesuaikan.

See all articles