php多线程采集,php浏览器模拟:用于多线程处理的curl_multi一族函数使用介绍

最近写一个php采集类程序脚本,研究了snoopy采集类,同时在搜集相关资料时发现curl_multi可用于多线程,于是进行了测试,实践证明效果相对很好。例子可参考 花瓣网图片采集器。下面是相关知识介绍,仅作参考。

curl_multi函数介绍

php中的curl_multi一族函数可用于多线程处理等问题,包括如下函数:

curl_multi_add_handle

curl_multi_close

curl_multi_exec

curl_multi_getcontent

curl_multi_info_read

curl_multi_init

curl_multi_remove_handle

curl_multi_select

curl函数参考

curl_init — 初始化一个curl会话

curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数

curl_errno — 返回一个包含当前会话错误信息的数字编号

curl_error — 返回一个包含当前会话错误信息的字符串

curl_exec — 执行一个curl会话

curl_getinfo — 获取一个curl连接资源句柄的信息

curl_multi_init — 初始化一个curl批处理句柄资源

curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源

curl_multi_close — 关闭一个批处理句柄资源

curl_multi_exec — 解析一个curl批处理句柄

curl_multi_getcontent — 返回获取的输出的文本流

curl_multi_info_read — 获取当前解析的curl的相关传输信息

curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源

curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"

curl_setopt_array — 以数组的形式为一个curl设置会话参数

curl_setopt — 为一个curl设置会话参数

curl_version — 获取curl相关的版本信息

curl_close — 关闭一个curl会话

一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

curl_muti函数使用方法

使用步骤总结如下:

第一步:调用curl_multi_init

第二步:循环调用curl_multi_add_handle

这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。

第三步:持续调用curl_multi_exec

第四步:根据需要循环调用curl_multi_getcontent获取结果

第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close

第六步:调用curl_multi_close

curl_multi多线程示例

这里有一个网上的一个例子,用于多线程并行采集多个页面内容,代码如下:

/**

* Perform parallel cURL request.

*

* @param array $urls Array of URLs to make request.

* @param array $options (Optional) Array of additional cURL options.

* @return mixed Results from the request (if any).

*/

function curlMultiRequest($urls, $options = array()) {

$ch = array();

$results = array();

$mh = curl_multi_init();

foreach($urls as $key => $val) {

$ch[$key] = curl_init();

if ($options) {

curl_setopt_array($ch[$key], $options);

}

curl_setopt($ch[$key], CURLOPT_URL, $val);

curl_multi_add_handle($mh, $ch[$key]);

}

$running = null;

do {

curl_multi_exec($mh, $running);

}

while ($running > 0);

// Get content and remove handles.

foreach ($ch as $key => $val) {

$results[$key] = curl_multi_getcontent($val);

curl_multi_remove_handle($mh, $val);

}

curl_multi_close($mh);

return $results;

}

PHPcurl 功能扩展基本用法 phpcurl扩展工能基本使用方法... 阅读详情

相关推荐

企业 IoT 产品安全渗透测试与欧盟 CRA 合规落地实战指南

欧盟 CRA(网络弹性法案)2026-09-11 漏洞报告义务生效,2027-12-11 全面强制产品安全不再是"加分项",而是市场准入的法律门槛本文面向 IoT 企业安全工程师/运维工程师,讲清楚如何从零建立渗透测试能力,并与 CRA 合规要求对齐落地。不讲空话,全是可执行的步骤。IoT 企业安全工程师、运维工程师负责产品合规的技术人员想从"被动响应"转向"主动安全"的团队[ ] 能独立完成 Web 应用渗透测试并输出报告[ ] 能对 REST/GraphQL API 进行安全评估。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 241

CurlMulti 一个php多线程类库

CurlMultiPHP多线程类库,修改用于QueryList,感兴趣的朋友们可以下载下来,用到自己的项目中。

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 802

curl_multi异步高并发服务实现

libcurl-easy方式是阻塞执行请求,当请求数量过大,或者需要高并发请求时,同步阻塞模式就会显示出性能瓶颈,执行效率低,延时严重,CPU占用率高,程序阻塞卡顿。所以采用异步方式,可以实现高并发请求的应用场景,异步可以在单线程中同时执行多个请求,等待curl文件标志或者自定义文件标志发生变化时,处理请求结果,支持在几千个平行连接上请求数据,基于事件处理结果。

baochunlei1的博客 5726

通过系统调用分析curl_multi运行原理 PHP

curl_multi 允许你可以并发的发起请求,再来逐个处理响应数据,说简单点就是利用了NIO + select / poll 涉及到的函数 1、curl_multi_exec 原型:curl_multi_exec ( resource $mh , int &$still_running ) : int 描述:处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。 就这,几个人能看懂是啥意思?示例中为何总是将它放在do…while中? $mh:连接集合。 $still_running:

猛犸象 2184

php curl_multi批量发送http请求

引子:在Android4.0开发中,发送Http请求已经不允许在主进程中执行了,必须在线程中执行。原因在于Http接口响应时间有可能阻塞主进程事件监听(对于.Net开发,其实也是如此)。但是,由于PHP并没有多线程的概念,那么,如何高效率在PHP中执行多次http请求呢?答案是使用curl_multi_init,由此,我做了一个实验。 以下是模拟请求的http接口,代码很简单,通过get传入的参

zhibin的程序日记 5244

php使用curl多线程提交

php不想java可以直接继承Thread接口或者实现Runnable接口,进行多线程的开发,不过php中提供了强大的curl工具支持多线程php中可以使用curl_multi_init()等来模仿并行处理多线程程序功能。同时可以使用curl_multi_init()模仿多线程的提交。如下面程序所示: <?php include "log.php"; $stime=microtime(

Jackie Wu 1250

php curl 模拟多线程,利用curl 多线程 模拟 并发的详解_PHP教程

首先,先了解下 php中的curl多线程函数:复制代码 代码如下:# curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getcontent# curl_multi_info_read# curl_multi_init# curl_multi_remove_handle# curl_multi_select一般...

weixin_26997697的博客 628

php多线程模拟请求,浅谈php使用curl模拟多线程发送请求

每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。phpcurl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。//设置缓冲为0(也可以去php.ini设置)ini_set('output_buffering', 0);//打开输出缓冲区ob...

weixin_28834765的博客 181

PHP CURL实现单线程、多线程方法

PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等。 然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集数据可以利用 phpQuery类来采集数据库, 在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件。 如果需要了解curl所有函数可以看这里:函数列表查看 下面是多线程使用到的curl相关函数curl_multi_add_handle — 向curl处理会话中添加

zsqwmj 2187

php curl 抓取js动态,PHP 利用 Curl Functions 实现多线程抓取网页和下载文件

PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,因此经常需要借助Curl Multi Functions 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件,至于具体实现过程,请参考下面几个例子:(1)下面这段代码是实现抓取多个URL,然后将...

weixin_34270668的博客 2200

php 模拟并发,利用curl 多线程 模拟 并发的详解

首先,先了解下 php中的curl多线程函数:# curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getcontent# curl_multi_info_read# curl_multi_init# curl_multi_remove_handle# curl_multi_select一般来说,想到要用这些函...

weixin_30810127的博客 285

php curl 模拟多线程,php利用curl 多线程 模拟 并发的详解

php利用curl 多线程 模拟 并发的详解发布于 2014-12-07 10:17:25 | 265 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后...

weixin_39756273的博客 241

curl_multi异步高并发服务

curl_multi_poll和curl_multi_wait区别有两个,一个是curl_multi_poll在被等待的时间内,可以调用curl_multi_wakeup激活,curl_multi_poll会加速返回。没有找到解决办法,可能和多线程调用有关。(4) 一次向multihand添加1000条任务,curl_multi_perform执行返回任务从1000降到0后,并不是所有分任务都执行完了,读取的数据也就600条左右,需要多次调用curl_multi_info_read去读取数据。

因热爱而执着,因执着而成功。 2182

PHP并发请求优化:使用`curl_multi_select()`实现高效的多请求处理

通过使用和,我们可以大幅提升 PHP 中并发请求的处理效率,特别是当需要处理大量外部请求时。这种方法不仅能提高响应速度,还能有效降低系统资源的消耗,是非常适合大规模并发处理的解决方案。希望这篇文章能为大家提供一些帮助,如果有类似需求的开发者也可以尝试这个方法。有什么问题或建议,欢迎留言交流!

leptune99的博客 1549

Curl 多线程

$urls = array("http://baidu.com", "http://21andy.com", "http://google.com"); $mp = new MultiHttpRequest($urls); $mp->start(); class_curl_multi.php /* * Curl 多线程类 * 使用方法: * ===============

Vi的专栏 635

php接口优化 使用curl_multi_init批量请求

curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数据传输。PHP中的curl库允许我们利用curl功能在PHP中进行网络通信。它提供了一系列的函数,可以发送HTTP请求并获取响应。PHPcurl库是一个非常强大的工具,可以用来进行网络通信。本文中,我们介绍了如何使用curl库来同时请求多个URL地址。通过创建多个curl句柄,并使用curl_multi_close()方法执行所有请求,我们可以方便地进行并发请求。

heshihu2019的博客 2020

PHP多页面并发抓取curl_multi_init的运用、curl报错Failed Initialization问题及curl_multi并不是真正无阻塞异步请求

多数情况下Curl函数能满足我们大多次的请求,不过偶尔我们需要同时抓取N多个网站数据时,会发现curl这种串联抓取会用时过长,因为CURL的抓取在PHP的执行过程中是按顺序执行,也就是前面一个抓取请求未完成时,后面一个请求就会一直处于等待状态,这就浪费了很多时间。此时curl_multi_init就能派上用场了。上面的程序并不复杂,可能一般也用得比较少,比如更多的时候我们是抓取指定curl

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1013

PHP+cURL扩展的使用

  PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的...

我的博客 2293

中国省、市、县夜间灯光数据集(1992-2022年)

1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/1403666332、代码特点:今年全新,手工精心整理,放心引用,数据来自权威,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题3、适用对象:大学生,本科生,研究生小白可用,容易上手!!!3、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理本数据包含excel格式和shp格式。数据名称:全国各省、市、县夜间灯光数据大全数据年份:1992-2022年数据指标:均值、总和、最小值、最大值、标准差。

上一篇: php _runmagicquotes,PHP函数第30款:转义字符函数_RunMagicQuotes
下一篇: php计算1000000以内的质数,1000000以内质数表
weixin_39572168
博客等级 码龄9年 31粉丝 151原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值