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

yizhihongxing

下面就详细讲解一下 “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的功能和用途。

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

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

相关文章

  • Linux C中多线程与volatile变量

    针对该问题,我为您提供如下完整讲解: Linux C中多线程与volatile变量 一、volatile变量的概念 在C语言中,volatile是一种类型限定符,通常用于修饰容易发生变化、被多线程访问或外部程序访问等的变量。该限定符告诉编译器不要对变量进行优化,每次使用变量都必须从内存中读取该变量的值,而不是从CPU寄存器中读取,保证多线程或外部程序对该变量…

    多线程 2023年5月16日
    00
  • php curl批处理实现可控并发异步操作示例

    下面是“php curl批处理实现可控并发异步操作示例”的完整攻略。 1. 准备工作 在开始之前,需要确保系统已经安装了curl扩展。可以通过以下命令来检查: php -m | grep curl 如果输出了curl,说明扩展已经安装成功。 2. 单个请求示例 首先来看一个简单的单个请求示例。代码如下: // 初始化curl $ch = curl_init(…

    多线程 2023年5月16日
    00
  • mysql中insert并发问题(on DUPLICATE KEY UPDATE)

    MySQL中的INSERT操作是非常常见的操作,但是在高并发的情况下,INSERT操作可能会出现一些问题,这就是INSERT并发问题。具体来说,当多个用户同时向一个表中进行INSERT操作时,就会有并发问题出现,可能会导致数据错乱、重复插入等问题。为了解决这个问题,MySQL引入了一个非常有用的特性:ON DUPLICATE KEY UPDATE。 ON D…

    多线程 2023年5月17日
    00
  • linux下c语言的多线程编程

    关于Linux下C语言的多线程编程,可以看做是单CPU多任务或并发执行的模式,使用线程可以有效地提高应用程序的执行效率和利用率,对于高并发场景下的服务端应用尤为重要。下面是具体的攻略: 一、线程的创建和销毁 Linux下的多线程编程主要用到pthread库,使用pthread库需要包含< pthread.h >头文件。 可以使用pthread_c…

    多线程 2023年5月17日
    00
  • 详解JUC并发编程中的进程与线程学习

    详解JUC并发编程中的进程与线程学习攻略 一、进程与线程的概念及区别 进程:是指正在执行的程序的实例。每个进程都有独立的内存空间,它可以包括多个线程。 线程:是指程序中独立、并发执行的最小单位,它直接依赖于进程,一个进程可以创建多个线程。 进程与线程的最大区别在于进程是资源分配的最小单位,线程是CPU调度的最小单位。线程共享进程的内存空间以及其他系统资源。 …

    多线程 2023年5月16日
    00
  • Java多线程并发生产者消费者设计模式实例解析

    Java多线程并发生产者消费者设计模式是一种常见的并发编程模式,它可以让生产者不停地生产数据,消费者不停地消费数据,从而实现高效的数据处理。下面,我将分为以下几个步骤详细讲解Java多线程并发生产者消费者设计模式实例解析。 1.生产者消费者设计模式的原理 生产者消费者设计模式是一种基于阻塞队列的并发模式。它的基本思想是,将生产者线程和消费者线程分别放在不同的…

    多线程 2023年5月17日
    00
  • 分析详解python多线程与多进程区别

    分析详解Python多线程与多进程区别 在Python中多线程和多进程是用来实现并发编程的两种不同的机制。在开始学习这两种技术之前,我们必须了解它们的异同之处,以便我们能够采用最合适的技术来解决具体问题。 什么是多线程? 多线程是将一个进程内部的任务分为不同的线程来进行同时执行的机制。每个线程都有自己的代码,自己的栈以及自己的寄存器,但是它们之间共享进程的内…

    多线程 2023年5月16日
    00
  • 示例剖析golang中的CSP并发模型

    以下是详细讲解 “示例剖析golang中的CSP并发模型” 的攻略。 什么是CSP并发模型 CSP (Communicating Sequential Processes),通信顺序进程,是一种并发计算模型,它通过通道(Channel)来实现协程(GoRoutines)间的通讯,类似于管道(Pipe)。 CSP模型的核心概念如下: 进程间通过通道进行通信和同…

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