Dalam pelaksanaan perangkak web, pelbagai benang tak segerak boleh meningkatkan kecekapan rangkak. Sebagai bahasa pengaturcaraan arus perdana, PHP juga boleh melaksanakan perangkak berbilang benang tak segerak melalui pengaturcaraan serentak Artikel ini akan memperkenalkan kaedah pelaksanaan khusus.
1. Gambaran keseluruhan perangkak berbilang benang tak segerak
rangkak berbilang benang tak segerak bergantung terutamanya pada dua teknologi: IO tak segerak dan pemprosesan berbilang benang. Dalam IO segerak tradisional, utas akan menunggu operasi IO selesai sebelum meneruskan ke langkah seterusnya. Dalam IO tak segerak, benang boleh melakukan operasi lain sementara menunggu operasi IO, dengan itu meningkatkan kecekapan menjalankan program. Multi-threading boleh melakukan pelbagai tugas pada masa yang sama, mempercepatkan pemprosesan tugas.
2. Prinsip pelaksanaan berbilang benang tak segerak
Melaksanakan berbilang benang tak segerak dalam PHP terutamanya bergantung pada dua sambungan: pthread dan cURL. Sambungan pthread ialah sambungan berbilang benang berdasarkan standard benang POSIX, yang boleh mendayakan fungsi berbilang benang dalam PHP. cURL ialah perpustakaan rangkaian yang digunakan dalam PHP, yang boleh merealisasikan penghantaran data rangkaian melalui cURL.
Proses utama untuk melaksanakan perangkak berbilang benang tak segerak adalah seperti berikut:
3. Langkah pelaksanaan
Di Linux, anda boleh menggunakan arahan berikut untuk memasang sambungan pthread:
sudo pecl install pthreads
Dalam Windows, anda boleh mendapatkan fail DLL sambungan pthread daripada tapak web rasmi PHP untuk pemasangan.
Penciptaan utas utama dan sub-utas boleh dicapai melalui kelas Thread dalam PHP.
kelas SpiderThread memanjangkan Thread {
private $url; public function __construct($url) { $this->url = $url; } public function run() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); $this->synchronized(function($thread){ $thread->notify(); }, $this); return $result; }
}
Urut utama boleh disegerakkan melalui kelas Mutex yang dilanjutkan oleh pthread.
$mutex = new Mutex();
$threads = array();
foreach($urls as $url) {
$mutex->lock(); $threads[] = new SpiderThread($url); end($threads)->start(); $mutex->unlock(); $mutex->synchronized(function($mutex){ $mutex->wait(); }, $mutex);
}
foreach($threads as $thread) {
$result = $thread->join(); //处理爬取结果
}
Dalam kod di atas, $urls ialah tatasusunan yang menyimpan pautan untuk dirangkak benang menjalankan pemprosesan tugas, dan hasil yang dikembalikan oleh benang kanak-kanak disimpan dalam $result.
Untuk meningkatkan kecekapan menjalankan program, kami boleh menggunakan teknologi kumpulan benang untuk mengurus penciptaan dan pemusnahan benang kanak-kanak. Sebilangan utas anak dikekalkan dalam kumpulan utas Apabila utas utama menyerahkan tugasan kepada kumpulan utas, kumpulan utas akan memilih salah satu utas melahu untuk pemprosesan tugasan berdasarkan status masa nyata benang.
Berikut ialah contoh pelaksanaan kumpulan benang ringkas:
kelas ThreadPool {
private $pool; private $tasks; public function __construct($size) { $this->pool = new SplQueue(); for($i = 0; $i < $size; $i++) { $this->pool->enqueue(new SpiderThread()); } $this->tasks = new SplQueue(); } public function execute($task) { if($this->pool->isEmpty()) { $this->tasks->enqueue($task); } else { $thread = $this->pool->dequeue(); $thread->execute($task); } } public function addThread($thread) { $this->pool->enqueue($thread); } public function addTask($task) { $this->tasks->enqueue($task); $this->checkTask(); } public function checkTask() { if(!$this->tasks->isEmpty() && !$this->pool->isEmpty()) { $thread = $this->pool->dequeue(); $task = $this->tasks->dequeue(); $thread->execute($task); } }
}
4 🎜>
Artikel ini memperkenalkan kaedah asas untuk melaksanakan perangkak berbilang benang tak segerak dalam PHP Berbilang benang dan penghantaran data rangkaian direalisasikan melalui pthread dan cURL, yang boleh meningkatkan kecekapan operasi perangkak. Dalam aplikasi praktikal, kecekapan menjalankan program boleh dipertingkatkan lagi dengan menggunakan teknologi thread pool.Atas ialah kandungan terperinci Cara melaksanakan perangkak berbilang benang tak segerak dengan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!