PHP使用CURL_MULTI实现多线程采集的例子

下面就详细讲解一下 “PHP使用CURL_MULTI实现多线程采集的例子”:

介绍

CURL是一个网络请求库,它可以以各种协议发送请求并获取响应。PHP内置了CURL扩展,使用它可以轻松地实现网络请求。CURL_MULTI是CURL的多线程版本,可以并发处理多个CURL请求。

在本篇文章中,我们将介绍如何利用PHP中的CURL_MULTI实现多线程采集。

步骤

1.初始化CURL并设置选项

$curl = curl_multi_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

我们使用curl_mutli_init初始化CURL_MULTI,并设置一些选项,包括将响应返回给调用程序,以及允许CURL自动重定向。

2.添加多个请求到curl_multi

$urls = array(
    'http://example.com/page1.html',
    'http://example.com/page2.html',
    'http://example.com/page3.html',
);

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_multi_add_handle($curl, $ch);
}

我们使用一个$urls数组,循环它并为每个URL创建一个CURL请求,设置类似的选项并将其添加到curl_multi。

3.运行curl_multi请求并读取响应

do {
    curl_multi_exec($curl, $running);
    curl_multi_select($curl);
} while ($running > 0);

foreach ($urls as $url) {
    $ch = curl_init($url);
    $response = curl_multi_getcontent($ch);
    curl_multi_remove_handle($curl, $ch);
    curl_close($ch);

    // 处理响应
}

我们使用do-while循环运行curl_multi请求,直到所有请求完成。然后我们使用curl_multi_getcontent读取每个响应,并在处理后从curl_multi中删除CURL请求。

在这里,$response就是我们从每个URL获取的响应。

示例

下面是两个使用CURL_MULTI的示例。首先是获取所有百度站内搜索结果的例子:

$curl = curl_multi_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

$results = array();
$query = 'baidu.com';
for ($page = 1; $page <= 10; $page++) {
    $url = "https://www.baidu.com/s?wd=site%3A{$query}&pn={$page}0";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_multi_add_handle($curl, $ch);
}

do {
    curl_multi_exec($curl, $running);
    curl_multi_select($curl);
} while ($running > 0);

for ($page = 1; $page <= 10; $page++) {
    $url = "https://www.baidu.com/s?wd=site%3A{$query}&pn={$page}0";
    $ch = curl_init($url);
    $response = curl_multi_getcontent($ch);
    curl_multi_remove_handle($curl, $ch);
    curl_close($ch);

    $doc = new DOMDocument();
    $doc->loadHTML($response);
    $xpath = new DOMXPath($doc);
    foreach ($xpath->query('//h3/a') as $node) {
        $results[] = array(
            'href' => $node->getAttribute('href'),
            'title' => $node->nodeValue,
        );
    }
}

curl_multi_close($curl);

print_r($results);

此代码将获取百度站内搜索结果的前10页,并将结果存储在$results数组中。

接下来是一个使用CURL_MULTI将多个文件作为单个zip文件下载的示例:

$curl = curl_multi_init();

$files = array(
    'http://example.com/file1.txt',
    'http://example.com/file2.txt',
    'http://example.com/file3.txt',
);

$zip = new ZipArchive();
$zip->open('files.zip', ZipArchive::CREATE);

foreach ($files as $file) {
    $ch = curl_init($file);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);

    $temp = tmpfile();
    curl_setopt($ch, CURLOPT_FILE, $temp);

    curl_multi_add_handle($curl, $ch);

    $handles[$file] = array(
        'ch' => $ch,
        'temp' => $temp,
    );
}

do {
    curl_multi_exec($curl, $running);
    curl_multi_select($curl);
} while ($running > 0);

foreach ($files as $file) {
    $handle = $handles[$file];
    fclose($handle['temp']);
    $zip->addFromString(basename($file), curl_multi_getcontent($handle['ch']));
    curl_multi_remove_handle($curl, $handle['ch']);
    curl_close($handle['ch']);
}

curl_multi_close($curl);
$zip->close();

此代码将多个文件下载并添加到单个zip文件中。

结论

这里介绍了如何采用CURL_MULTI实现的多线程采集,包括设置CURL请求选项、将请求添加到CURL_MULTI中以及获取响应和处理响应等步骤。我们还看了两个实际的例子来说明CURL_MULTI的功能和用途。

阅读剩余 70%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP使用CURL_MULTI实现多线程采集的例子 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 理解python多线程(python多线程简明教程)

    下面是关于如何理解 Python 多线程的攻略。 概述 Python 是一种简单易学的编程语言,支持多线程和多进程。多线程是 Python 开发中比较重要的部分,它可以让程序执行异步和并发操作,从而提高程序的性能和并发度。 Python 多线程的概念 Python 多线程是指在程序中同时运行多个线程,每个线程都可以运行不同的任务,这些任务可以在同一个时间段内…

    多线程 2023年5月17日
    00
  • java之使用多线程代替for循环(解决主线程提前结束问题)

    下面是使用多线程代替for循环的攻略,我将分几个部分进行讲解。 什么是多线程? 多线程是指同时执行多个线程(程序),也就是并发执行。与单线程相比,多线程可以将程序的性能提高数倍,但是多线程也存在一些问题,如线程安全、线程同步等。 为什么要使用多线程代替for循环? 在Java中,使用for循环进行数据的处理是非常常见的操作。但是当待处理的数据量较大时,使用f…

    多线程 2023年5月17日
    00
  • 深入解析Java并发程序中线程的同步与线程锁的使用

    深入解析Java并发程序中线程的同步与线程锁的使用 在Java并发程序中,线程的同步和线程锁是必不可少的。线程的同步是指多个线程协同工作,按一定的顺序执行,而线程锁则是保证多个线程访问共享资源时数据的正确性和一致性。 线程同步 Java中线程同步的主要方式有以下两种: 1. synchronized关键字 synchronized关键字可以修饰方法和代码块,…

    多线程 2023年5月16日
    00
  • java 多线程-线程通信实例讲解

    下面是关于“java 多线程-线程通信实例讲解”的完整攻略: 1. 为什么需要线程通信? 在多线程场景下,线程之间需要相互协作才能完成复杂的逻辑。通常情况下,线程之间的协作需要通过线程通信来实现。 在实际应用中,线程通信主要包括以下两种场景: 生产者和消费者模式:生产者线程负责生产数据,消费者线程负责消费数据。生产者线程需要将生产的数据传递给消费者线程,消费…

    多线程 2023年5月17日
    00
  • 如何让python程序正确高效地并发

    如何让Python程序正确高效地并发 在Python中,有许多方式可以实现程序的并发,比如: 多线程(使用标准库threading) 多进程(使用标准库multiprocessing) 协程(使用第三方库asyncio) 而在并发编程中,最关键的是要正确高效地使用锁等同步机制,以避免出现数据竞争等并发问题。下面将详细介绍如何正确高效地使用上述并发编程方式。 …

    多线程 2023年5月16日
    00
  • Java并发程序入门介绍

    Java并发程序入门介绍攻略 简介 Java并发编程是指在多线程环境下,多个线程之间相互合作、协同工作的编程模型。Java并发编程常常被采用于提高程序运行效率、提升程序响应速度以及提高程序质量等方面。本篇文章将简单介绍Java并发编程的基本知识,包括Java并发编程的常见术语、Java并发编程的核心知识点以及Java并发编程的示例等。 Java并发编程常见术…

    多线程 2023年5月16日
    00
  • 如何在Python中编写并发程序

    一、什么是并发编程 并发编程是指程序同时执行多个任务的一种编程方式。在Python中,这通常通过多线程、多进程和协程来实现。 在多线程、多进程和协程中,每个任务都是独立的,它们可以在不影响其他任务的情况下并发执行,从而提高程序的效率。 二、如何在Python中编写多线程程序 使用threading模块创建线程 Python中内置的threading模块提供了…

    多线程 2023年5月17日
    00
  • Java多线程深入理解

    Java多线程深入理解攻略 在进行深入理解Java多线程的过程中,需要掌握以下几点: 1. 线程的创建和启动 Java中线程的创建有两种方式,一种是继承Thread类,一种是实现Runnable接口。其中,实现Runnable接口的方式更加灵活,因为一个类可以实现多个接口。 // 继承Thread类 class MyThread extends Thread…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部