Rumah pembangunan bahagian belakang tutorial php Teknik concurrency dan multi-threading untuk perangkak PHP

Teknik concurrency dan multi-threading untuk perangkak PHP

Aug 08, 2023 pm 02:31 PM
Pemprosesan serentak php crawler Petua Multithreading

Teknik concurrency dan multi-threading untuk perangkak PHP

Kemahiran pemprosesan selaras dan berbilang benang perangkak PHP

Pengenalan:
Dengan perkembangan pesat Internet, sejumlah besar maklumat data disimpan di pelbagai tapak web, dan mendapatkan data ini telah menjadi keperluan dalam banyak perniagaan senario. Sebagai alat untuk mendapatkan maklumat rangkaian secara automatik, perangkak digunakan secara meluas dalam pengumpulan data, enjin carian, analisis pendapat umum dan bidang lain. Artikel ini akan memperkenalkan teknik pemprosesan serentak dan berbilang benang untuk kelas perangkak berasaskan PHP, dan menggambarkan pelaksanaannya melalui contoh kod.

1. Struktur asas kelas reptilia
Sebelum melaksanakan pemprosesan serentak dan berbilang benang bagi kelas reptilia, mari kita lihat dahulu struktur kelas reptilia asas.

class Crawler {
    private $startUrl;

    public function __construct($startUrl) {
        $this->startUrl = $startUrl;
    }

    public function crawl() {
        // 获取初始页面的内容
        $content = $this->getContent($this->startUrl);

        // 解析页面内容,获取需要的信息
        $data = $this->parseContent($content);

        // 处理获取到的信息,进行业务逻辑处理或存储
        $this->processData($data);

        // 获取页面中的链接,并递归抓取
        $urls = $this->getUrls($content);
        foreach ($urls as $url) {
            $content = $this->getContent($url);
            $data = $this->parseContent($content);
            $this->processData($data);
        }
    }

    private function getContent($url) {
        // 发起HTTP请求,获取页面内容
        // ...
        return $content;
    }

    private function parseContent($content) {
        // 解析页面内容,提取需要的信息
        // ...
        return $data;
    }

    private function processData($data) {
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }

    private function getUrls($content) {
        // 获取页面中的链接
        // ...
        return $urls;
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mentakrifkan kelas Crawler dan menghantar URL permulaan melalui pembina. Dalam kaedah crawl(), kami mula-mula mendapatkan kandungan halaman permulaan, kemudian menghuraikan kandungan halaman dan mengekstrak maklumat yang diperlukan. Selepas itu, kita boleh memproses maklumat yang diperolehi, seperti menyimpannya dalam pangkalan data. Akhir sekali, kami mendapat pautan dalam halaman dan merangkak halaman lain secara rekursif.

2. Pemprosesan serentak
Biasanya, perangkak perlu memproses sejumlah besar URL, dan operasi IO bagi permintaan rangkaian sangat memakan masa. Jika kami menggunakan pelaksanaan berurutan, meminta yang seterusnya selepas satu permintaan selesai akan mengurangkan kecekapan merangkak kami. Untuk meningkatkan keupayaan pemprosesan serentak, kami boleh menggunakan sambungan berbilang proses PHP untuk mencapai matlamat ini.

class ConcurrentCrawler {
    private $urls;

    public function __construct($urls) {
        $this->urls = $urls;
    }

    public function crawl() {
        $workers = [];
        $urlsNum = count($this->urls);
        $maxWorkersNum = 10; // 最大进程数

        for ($i = 0; $i < $maxWorkersNum; $i++) {
            $pid = pcntl_fork();
            if ($pid == -1) {
                die('fork failed');
            } else if ($pid == 0) {
                for ($j = $i; $j < $urlsNum; $j += $maxWorkersNum) {
                    $this->processUrl($this->urls[$j]);
                }
                exit();
            } else {
                $workers[$pid] = true;
            }
        }

        while (count($workers)) {
            $pid = pcntl_wait($status, WUNTRACED);
            if ($status == 0) {
                unset($workers[$pid]);
            } else {
                $workers[$pid] = false;
            } 
        }
    }

    private function processUrl($url) {
        // 发起HTTP请求,获取页面内容
        // ...
        // 解析页面内容,获取需要的信息
        // ...
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mentakrifkan kelas ConcurrentCrawler dan menghantar satu set URL yang perlu dirangkak melalui pembina. Dalam kaedah crawl(), kami menggunakan kaedah berbilang proses untuk pemprosesan serentak. Dengan menggunakan fungsi pcntl_fork(), sebahagian daripada URL diproses dalam setiap proses anak, manakala proses induk bertanggungjawab untuk mengurus proses anak. Akhir sekali, tunggu penghujung semua proses anak melalui fungsi pcntl_wait().

3. Pemprosesan berbilang benang
Selain menggunakan pelbagai proses untuk pemprosesan serentak, kami juga boleh menggunakan sambungan Benang PHP untuk melaksanakan pemprosesan berbilang benang.

class MultithreadCrawler extends Thread {
    private $url;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        // 发起HTTP请求,获取页面内容
        // ...
        // 解析页面内容,获取需要的信息
        // ...
        // 处理获取到的信息,进行逻辑处理或存储
        // ...
    }
}

class Executor {
    private $urls;

    public function __construct($urls) {
        $this->urls = $urls;
    }

    public function execute() {
        $threads = [];
        foreach ($this->urls as $url) {
            $thread = new MultithreadCrawler($url);
            $thread->start();
            $threads[] = $thread;
        }

        foreach ($threads as $thread) {
            $thread->join();
        }
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mentakrifkan kelas MultithreadCrawler, yang mewarisi daripada kelas Thread, dan menulis semula kaedah run() sebagai logik utama utas. Dalam kelas Executor, kami mencipta berbilang benang melalui gelung dan memulakannya untuk pelaksanaan. Akhir sekali, tunggu penghujung semua utas melalui kaedah join().

Kesimpulan:
Melalui pengenalan teknik pemprosesan konkurensi dan berbilang benang perangkak PHP, kami dapati bahawa kedua-dua pemprosesan konkurensi dan pemprosesan berbilang benang boleh meningkatkan kecekapan rangkak perangkak. Walau bagaimanapun, dalam proses pembangunan sebenar, kita perlu memilih kaedah pemprosesan yang sesuai mengikut situasi tertentu. Pada masa yang sama, untuk memastikan keselamatan berbilang benang atau berbilang proses, kami juga perlu melakukan operasi penyegerakan yang sesuai semasa pemprosesan.

Atas ialah kandungan terperinci Teknik concurrency dan multi-threading untuk perangkak PHP. 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)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu 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)

PHP8.1 dikeluarkan: Memperkenalkan curl untuk pemprosesan serentak berbilang permintaan PHP8.1 dikeluarkan: Memperkenalkan curl untuk pemprosesan serentak berbilang permintaan Jul 08, 2023 pm 09:13 PM

PHP8.1 dikeluarkan: Memperkenalkan curl untuk pemprosesan serentak berbilang permintaan Baru-baru ini, PHP secara rasmi mengeluarkan versi terkini PHP8.1, yang memperkenalkan ciri penting: curl untuk pemprosesan serentak berbilang permintaan. Ciri baharu ini menyediakan pembangun cara yang lebih cekap dan fleksibel untuk mengendalikan berbilang permintaan HTTP, meningkatkan prestasi dan pengalaman pengguna dengan pesat. Dalam versi sebelumnya, pengendalian berbilang permintaan selalunya memerlukan mencipta berbilang sumber curl dan menggunakan gelung untuk menghantar dan menerima data masing-masing. Walaupun kaedah ini boleh mencapai tujuan

Cara menggunakan perangkak PHP untuk merangkak data besar Cara menggunakan perangkak PHP untuk merangkak data besar Jun 14, 2023 pm 12:52 PM

Dengan kemunculan era data dan kepelbagaian volum data dan jenis data, semakin banyak syarikat dan individu perlu mendapatkan dan memproses sejumlah besar data. Pada masa ini, teknologi crawler menjadi kaedah yang sangat berkesan. Artikel ini akan memperkenalkan cara menggunakan perangkak PHP untuk merangkak data besar. 1. Pengenalan kepada crawler: Crawler ialah teknologi yang memperoleh maklumat Internet secara automatik. Prinsipnya adalah untuk mendapatkan dan menghuraikan kandungan laman web secara automatik di Internet dengan menulis program, dan menangkap data yang diperlukan untuk pemprosesan atau penyimpanan. Dalam evolusi program perangkak, ramai yang matang

Teknik pengoptimuman tempatan untuk menyelesaikan kesesakan kelajuan akses laman web bahasa Go Teknik pengoptimuman tempatan untuk menyelesaikan kesesakan kelajuan akses laman web bahasa Go Aug 07, 2023 am 10:07 AM

Petua pengoptimuman tempatan untuk menyelesaikan kesesakan kelajuan akses laman web bahasa Go Ringkasan: Bahasa Go ialah bahasa pengaturcaraan yang pantas dan cekap sesuai untuk membina aplikasi rangkaian berprestasi tinggi. Walau bagaimanapun, apabila kami membangunkan tapak web dalam bahasa Go, kami mungkin menghadapi beberapa kesesakan kelajuan akses. Artikel ini akan memperkenalkan beberapa teknik pengoptimuman tempatan untuk menyelesaikan masalah sedemikian, dengan contoh kod. Menggunakan pengumpulan sambungan Dalam bahasa Go, setiap permintaan ke pangkalan data atau perkhidmatan pihak ketiga memerlukan sambungan baharu. Untuk mengurangkan overhed yang disebabkan oleh penciptaan dan kemusnahan sambungan, kita boleh

Bagaimanakah rangka kerja golang mengendalikan konkurensi dan pengaturcaraan tak segerak? Bagaimanakah rangka kerja golang mengendalikan konkurensi dan pengaturcaraan tak segerak? Jun 02, 2024 pm 07:49 PM

Rangka kerja Go menggunakan ciri serentak dan tak segerak Go untuk menyediakan mekanisme untuk mengendalikan tugas serentak dan tak segerak dengan cekap: 1. Keselarasan dicapai melalui Goroutine, membolehkan berbilang tugasan dilaksanakan pada masa yang sama 2. Pengaturcaraan tak segerak dilaksanakan melalui saluran, yang boleh dilaksanakan tanpa menyekat utas utama Tugas 3. Sesuai untuk senario praktikal, seperti pemprosesan serentak permintaan HTTP, pemerolehan tak segerak data pangkalan data, dsb.

Coroutine melaksanakan pengaturcaraan berbilang benang PHP dan pemprosesan serentak yang cekap Coroutine melaksanakan pengaturcaraan berbilang benang PHP dan pemprosesan serentak yang cekap Jun 30, 2023 pm 05:09 PM

Amalan pengaturcaraan berbilang benang PHP: menggunakan coroutine untuk melaksanakan pemprosesan tugas serentak Dengan pembangunan aplikasi Internet, keperluan untuk prestasi pelayan dan keupayaan pemprosesan serentak menjadi lebih tinggi dan lebih tinggi. Pengaturcaraan berbilang benang tradisional tidak mudah untuk dilaksanakan dalam PHP, jadi untuk meningkatkan keupayaan pemprosesan serentak PHP, anda boleh cuba menggunakan coroutine untuk melaksanakan pengaturcaraan berbilang benang. Coroutine ialah model pemprosesan serentak ringan yang boleh melaksanakan pelaksanaan serentak berbilang tugas dalam satu urutan. Berbanding dengan pelbagai benang tradisional, kos penukaran coroutine lebih rendah

Bagaimana untuk menangani isu muat naik fail serentak dalam bahasa Go? Bagaimana untuk menangani isu muat naik fail serentak dalam bahasa Go? Oct 08, 2023 am 09:47 AM

Bagaimana untuk menangani isu muat naik fail serentak dalam bahasa Go? Dengan perkembangan Internet, muat naik fail telah menjadi lebih dan lebih biasa dalam pembangunan harian. Dalam proses muat naik fail, pengendalian muat naik serentak berbilang fail telah menjadi pertimbangan utama. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk menangani isu muat naik fail serentak dan memberikan contoh kod khusus. 1. Muat naik fail ke pelayan Sebelum memulakan muat naik fail serentak, anda perlu terlebih dahulu memahami cara memuat naik fail ke pelayan. Menggunakan bahasa Go untuk memuat naik fail boleh menggunakan pustaka standard

Kaedah pelaksanaan perangkak PHP berprestasi tinggi Kaedah pelaksanaan perangkak PHP berprestasi tinggi Jun 13, 2023 pm 03:22 PM

Dengan perkembangan Internet, jumlah maklumat dalam halaman web semakin besar dan mendalam, dan ramai orang perlu mengekstrak maklumat yang mereka perlukan dengan cepat daripada jumlah data yang besar. Pada masa ini, crawler telah menjadi salah satu alat penting. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menulis perangkak berprestasi tinggi untuk mendapatkan maklumat yang diperlukan dengan cepat dan tepat daripada rangkaian. 1. Fahami prinsip asas crawler Fungsi asas crawler adalah untuk mensimulasikan pelayar untuk mengakses halaman web dan mendapatkan maklumat tertentu. Ia boleh mensimulasikan satu siri operasi yang dilakukan oleh pengguna dalam pelayar web, seperti menghantar permintaan kepada pelayan.

Kaedah untuk program Java untuk mengoptimumkan prestasi konkurensi pertanyaan MySQL Kaedah untuk program Java untuk mengoptimumkan prestasi konkurensi pertanyaan MySQL Jun 30, 2023 am 08:07 AM

Bagaimana untuk mengoptimumkan prestasi pertanyaan dan prestasi konkurensi sambungan MySQL dalam program Java? MySQL ialah pangkalan data hubungan yang biasa digunakan, dan Java ialah bahasa pengaturcaraan yang biasa digunakan. Semasa proses pembangunan, kita sering menghadapi situasi di mana kita perlu berinteraksi dengan pangkalan data MySQL. Untuk meningkatkan prestasi dan keselarasan program, kami boleh melakukan beberapa pengoptimuman. Menggunakan kolam sambungan Kolam sambungan ialah satu mekanisme untuk menguruskan sambungan pangkalan data Ia boleh menggunakan semula sambungan pangkalan data dan mengelakkan pembuatan dan pemusnahan sambungan pangkalan data yang kerap. Di Jawa, kami

See all articles