Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara melaksanakan perangkak berbilang benang tak segerak dengan PHP

Cara melaksanakan perangkak berbilang benang tak segerak dengan PHP

PHPz
PHPzasal
2023-06-13 13:31:411291semak imbas

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:

  1. Buat utas utama dan berbilang sub-benang, dan sub-benang boleh dibuat dan dimusnahkan mengikut keperluan.
  2. Apabila utas utama bermula, ia mengeluarkan tugasan yang belum selesai daripada baris gilir tugas dan menugaskan tugas itu kepada sub-utas untuk diproses.
  3. Apabila urutan anak bermula, mulakan permintaan rangkaian melalui cURL untuk mendapatkan data yang diperlukan.
  4. Semasa menunggu respons rangkaian, sub-benang boleh mengendalikan tugasan lain, sekali gus mempercepatkan kecekapan operasi perangkak.
  5. Apabila permintaan sub-utas selesai, data yang dirangkak akan dihantar ke utas utama dan utas utama akan menyimpan hasil di lokasi storan yang ditentukan.
  6. Jika masih ada tugasan yang perlu diproses dalam baris gilir tugas, ulangi langkah di atas.

3. Langkah pelaksanaan

  1. Pasang sambungan pthread

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.

  1. Buat utas utama dan sub-utas

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.

  1. Melaksanakan kumpulan benang

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!

Kenyataan:
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