Rumah pembangunan bahagian belakang tutorial php php多进程中curl_multi的应用

php多进程中curl_multi的应用

May 28, 2017 am 09:37 AM
pelbagai proses

相信许多人对PHP手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子 更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完整的应用例子。

  • curl_multi_add_handle

  • curl_multi_close

  • curl_multi_exec

  • curl_multi_getcontent

  • curl_multi_info_read

  • curl_multi_init

  • curl_multi_remove_handle

  • curl_multi_select

一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

步骤总结如下:

第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会说明为何dirty):

/*
Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1
*/

$connomains = array(
"http://www.cnn.com/",
"http://www.canada.com/",
"http://www.yahoo.com/"
);

$mh = curl_multi_init();

foreach ($connomains as $i => $url) {
     $conn[$i]=curl_init($url);
      curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
      curl_multi_add_handle ($mh,$conn[$i]);
}

do { $n=curl_multi_exec($mh,$active); } while ($active);

foreach ($connomains as $i => $url) {
      $res[$i]=curl_multi_getcontent($conn[$i]);
      curl_close($conn[$i]);
}

print_r($res);

 

整个使用过程差不多就是这样,但是,这个简单代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用100%。

现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。

把上面do的那段改成下面这样:

                do {
                        $mrc = curl_multi_exec($mh,$active);
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                while ($active and $mrc == CURLM_OK) {
                        if (curl_multi_select($mh) != -1) {
                                do {
                                        $mrc = curl_multi_exec($mh, $active);
                                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                        }
                }

因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。

另外:还有一些细节的地方可能有时候要遇到:

控制每一个请求的超时时间,在curl_multi_add_handle之前通过curl_setopt去做:
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

判断是否超时了或者其他错误,在curl_multi_getcontent之前用:curl_error($conn[$i]);


Atas ialah kandungan terperinci php多进程中curl_multi的应用. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

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)

Kaedah aplikasi memori kongsi antara pelbagai proses dalam fungsi Golang Kaedah aplikasi memori kongsi antara pelbagai proses dalam fungsi Golang May 17, 2023 pm 12:52 PM

Sebagai bahasa pengaturcaraan yang sangat serentak, mekanisme coroutine terbina dalam Golang dan operasi berbilang benang membolehkan berbilang tugas yang ringan. Walau bagaimanapun, dalam senario pemprosesan berbilang proses, komunikasi dan memori dikongsi antara proses yang berbeza telah menjadi isu utama dalam pembangunan program. Artikel ini akan memperkenalkan kaedah aplikasi merealisasikan memori dikongsi antara pelbagai proses di Golang. 1. Bagaimana untuk melaksanakan pelbagai proses di Golang Di Golang, pemprosesan serentak pelbagai proses boleh dilaksanakan dalam pelbagai cara, termasuk fork, os.Process,

Mari bercakap tentang berbilang proses dan berbilang benang dalam Node.js Mari bercakap tentang berbilang proses dan berbilang benang dalam Node.js Jul 25, 2022 pm 07:45 PM

Semua orang tahu bahawa Node.js adalah satu-benang, tetapi mereka tidak tahu bahawa ia juga menyediakan modul berbilang-benang untuk mempercepatkan pemprosesan beberapa tugasan khas Artikel ini akan membawa anda memahami berbilang-benang Node. js, berharap untuk mengetahui lebih lanjut mengenainya. Semua orang membantu!

Adakah golang pelbagai proses? Adakah golang pelbagai proses? Jul 07, 2023 am 10:18 AM

Golang ialah pelbagai proses, dan model utasnya ialah model MPG Secara keseluruhan, proses Go dan utas kernel sepadan dengan banyak-ke-banyak, jadi pertama sekali, mereka mesti berbilang benang. Golang mempunyai beberapa model N go yang dipanggil boleh dibuat di bawah benang M Secara umumnya, N adalah lebih besar daripada M. Walau bagaimanapun, penjadualan coroutine ditentukan oleh Go runtime adalah ditekankan bahawa pembangun harus Menggunakan saluran untuk penyegerakan antara coroutine.

Kunci dan penyegerakan dalam pengaturcaraan serentak Python: memastikan kod anda selamat dan boleh dipercayai Kunci dan penyegerakan dalam pengaturcaraan serentak Python: memastikan kod anda selamat dan boleh dipercayai Feb 19, 2024 pm 02:30 PM

Kunci dan Penyegerakan dalam Pengaturcaraan Serentak Dalam pengaturcaraan serentak, berbilang proses atau utas berjalan serentak, yang boleh membawa kepada isu pertikaian sumber dan ketidakkonsistenan. Untuk menyelesaikan masalah ini, kunci dan mekanisme penyegerakan diperlukan untuk menyelaraskan akses kepada sumber yang dikongsi. Konsep Kunci Kunci ialah mekanisme yang membenarkan hanya satu utas atau proses mengakses sumber yang dikongsi pada satu masa. Apabila satu utas atau proses memperoleh kunci, utas atau proses lain disekat daripada mengakses sumber sehingga kunci dilepaskan. Jenis kunci Terdapat beberapa jenis kunci dalam ular sawa: Kunci Mutex (Mutex): memastikan bahawa hanya satu utas atau proses boleh mengakses sumber pada satu masa. Pembolehubah keadaan: Membenarkan benang atau proses menunggu keadaan tertentu dan kemudian memperoleh kunci. Kunci baca-tulis: membenarkan berbilang utas membaca sumber pada masa yang sama, tetapi hanya membenarkan satu utas menulis sumber

Penjelasan terperinci tentang bagaimana nod melaksanakan pelbagai proses? Bagaimana untuk menggunakan projek nod? Penjelasan terperinci tentang bagaimana nod melaksanakan pelbagai proses? Bagaimana untuk menggunakan projek nod? Aug 03, 2022 pm 08:23 PM

Bagaimana untuk melaksanakan pelbagai proses dalam nod? Bagaimana untuk menggunakan projek nod? Artikel berikut akan membantu anda menguasai pengetahuan berkaitan model berbilang proses dan penggunaan projek Node.js, saya harap ia akan membantu anda.

Ringkasan soalan lazim tentang temu bual pembangunan pelbagai proses PHP (dengan jawapan) Ringkasan soalan lazim tentang temu bual pembangunan pelbagai proses PHP (dengan jawapan) Dec 21, 2022 pm 05:30 PM

Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP Ia terutamanya memperkenalkan isu-isu yang berkaitan dengan pembangunan pelbagai proses PHP Berikut adalah ringkasan beberapa isu pembangunan pelbagai proses untuk anda, dengan jawapannya berguna kepada semua orang.

Kemahiran pengaturcaraan serentak Golang: analisis mendalam model pelbagai proses Kemahiran pengaturcaraan serentak Golang: analisis mendalam model pelbagai proses Feb 29, 2024 am 10:36 AM

Petua Pengaturcaraan Serentak Golang: Analisis Mendalam Model Pelbagai Proses Dalam bidang pengaturcaraan serentak, Golang, sebagai bahasa pengaturcaraan yang berkuasa, digemari oleh pembangun kerana sintaksnya yang ringkas dan sokongan serentak terbina dalam. Di Golang, pengaturcaraan serentak boleh dilaksanakan dengan mudah menggunakan goroutine dan saluran, meningkatkan prestasi dan kecekapan program. Walau bagaimanapun, dalam beberapa senario tertentu, menggunakan model berbilang proses juga merupakan cara yang berkesan untuk pengaturcaraan serentak. Artikel ini akan memberikan analisis mendalam tentang cara menggunakan Golang

Bagaimana untuk menggunakan pelbagai proses dalam Go? Bagaimana untuk menggunakan pelbagai proses dalam Go? May 11, 2023 pm 03:24 PM

Dengan peningkatan prestasi komputer dan populariti pemproses berbilang teras, pengaturcaraan berbilang proses secara beransur-ansur menjadi bahagian yang amat diperlukan dalam bidang pengaturcaraan moden. Dalam bahasa Go, pengaturcaraan berbilang proses juga sangat mudah untuk dilaksanakan. Artikel ini akan memperkenalkan cara menggunakan berbilang proses dalam Go. 1. Goroutines Dalam bahasa Go, pengaturcaraan serentak boleh dicapai melalui Goroutines. "Goroutine" boleh dianggap sebagai "benang ringan" dalam bahasa Go. Goroutines dijadualkan mengikut masa jalanan Go, dan

See all articles