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的功能和用途。

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

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

相关文章

  • java并发编程专题(二)—-如何创建并运行java线程

    下面我来详细讲解如何创建并运行Java线程,包括以下的内容: Java多线程简介 创建Thread子类 实现Runnable接口 示例说明:继承Thread类创建线程 示例说明:实现Runnable接口创建线程 1. Java多线程简介 在Java中,线程指的是轻量级进程,一个程序可以同时运行多个线程,每个线程都有自己的执行路径和执行状态,互不干扰。Java…

    多线程 2023年5月16日
    00
  • 大数据量高并发的数据库优化详解

    大数据量高并发的数据库优化详解 为什么需要数据库优化? 随着业务的发展,数据库中存储的数据量和访问量会逐渐增大,随之带来的是数据库性能的下降和访问延迟的增加。为了提高业务系统的性能,必须对数据库进行优化。 数据库优化的方向 通常我们从以下几方面对数据库进行优化: SQL 优化 索引优化 数据库服务器配置优化 读写分离和分库分表等方式 SQL 优化 SQL 优…

    多线程 2023年5月17日
    00
  • PHP使用Pthread实现的多线程操作实例

    下面我将详细介绍如何使用 Pthread 实现 PHP 的多线程操作。 什么是 Pthread Pthread 是 PHP 中的一个扩展库,它支持 POSIX 线程(或称 Pthreads)操作,可以在同一进程中创建多个线程,从而实现并行处理和多线程并发执行等操作。 安装 Pthread 扩展 在使用 Pthread 扩展前,需要先安装该扩展。下面介绍 Pt…

    多线程 2023年5月17日
    00
  • C++可扩展性与多线程超详细精讲

    C++可扩展性与多线程超详细精讲 前言 C++语言是一门十分强大且广泛应用的编程语言,其可用于开发各种不同类型的应用程序。本篇文章主要讲解C++的可扩展性与多线程编程。 可扩展性 在软件开发中,可扩展性是指当需求增加时,我们能够轻松扩展应用程序。以下是几个重要的概念: 抽象类和纯虚函数 抽象类中含有至少一个纯虚函数,纯虚函数是一个虚函数,在函数原型后面使用 …

    多线程 2023年5月17日
    00
  • Java使用代码模拟高并发操作的示例

    我来为你详细讲解Java使用代码模拟高并发操作的示例攻略。 1. 实现思路 高并发是指在同一时间内有大量的请求涌入到系统中,如何处理这些请求成为一个挑战。使用代码模拟高并发操作,则可以帮助我们评估系统在高并发情况下的稳定性和可靠性。实现思路如下: 定义一个接口或者方法,并为该方法添加synchronized关键字,确保该方法同一时间只能被一个线程访问,以模拟…

    多线程 2023年5月16日
    00
  • Java并发程序刺客之假共享的原理及复现

    Java并发程序刺客之假共享 1. 假共享的概念 假共享(False sharing)是指多个线程访问共享内存中不同的变量,但它们彼此之间共享了同一个缓存行(cache line),这样就会频繁地触发缓存一致性协议,导致性能下降。 缓存一致性协议(Coherence protocol)是指在多个处理器/核心之间共享缓存的时候保持数据一致的一种协议。常见的协议…

    多线程 2023年5月16日
    00
  • iOS开发探索多线程GCD队列示例详解

    iOS开发探索多线程GCD队列示例详解 在iOS开发中,经常需要使用多线程编程来提高应用程序的性能和响应速度。而GCD(Grand Central Dispatch)则是iOS中多线程编程的一种新方式,它使用了轻量级的线程和任务调度机制,可以自动利用所有可用的CPU核心,方便易用且性能强大。 本文将针对GCD的队列进行详细讲解,包括串行队列和并发队列,并给出…

    多线程 2023年5月16日
    00
  • 基于Java回顾之多线程详解

    基于Java回顾之多线程详解 Java作为一门支持多线程编程的语言,多线程编程已经成为JVM生态中极为重要的编程技巧之一。Java提供了许多多线程编程的API及相关库,可以轻松实现多线程程序。本文将从以下几个方面来详细讲解Java多线程编程的相关知识: 多线程基础概念 多线程编程的五种方式 多线程的同步与锁机制 Java 线程池 多线程基础概念 在Java多…

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