PHP利用CURL_MULTI实现多线程
PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就一个利用PHP CURL_MULTI多线程采集网页为例来说明一下。
01
|
<?php
|
02
|
//功能:PHP利用CURL_MULTI多线程采集网页函数
|
03
|
$text =remote( array ( 'http://www.phpernote.com' , 'http://www.baidu.com/' , 'http://www.google.com.hk/' , 'http://www.taobao.com' ));
|
04
|
print_r( $text );
|
05
|
function remote( $urls ){
|
06
|
if (! is_array ( $urls )||! count ( $urls )){
|
07
|
return false;
|
08
|
}
|
09
|
$curl = $text = array ();
|
10
|
$handle =curl_multi_init();
|
11
|
foreach ( $urls as $k => $v ){
|
12
|
//$nurl[$k]=preg_replace('/([^:\/\.]+)/i',rawurlencode('\\1'),$v);
|
13
|
//$curl[$k]=curl_init($nurl[$k]);
|
14
|
$curl [ $k ]=curl_init( $v );
|
15
|
curl_setopt( $curl [ $k ], CURLOPT_RETURNTRANSFER,1);
|
16
|
curl_setopt( $curl [ $k ], CURLOPT_HEADER,0);
|
17
|
curl_multi_add_handle( $handle , $curl [ $k ]);
|
18
|
}
|
19
|
$active = null;
|
20
|
do {
|
21
|
$mrc =curl_multi_exec( $handle , $active );
|
22
|
} while ( $mrc ==CURLM_CALL_MULTI_PERFORM);
|
23
|
while ( $active && $mrc ==CURLM_OK){
|
24
|
if (curl_multi_select( $handle )!=-1){
|
25
|
do {
|
26
|
$mrc =curl_multi_exec( $handle , $active );
|
27
|
} while ( $mrc ==CURLM_CALL_MULTI_PERFORM);
|
28
|
}
|
29
|
}
|
30
|
|
31
|
foreach ( $curl as $k => $v ){
|
32
|
if (curl_error( $curl [ $k ])== "" ){
|
33
|
$text [ $k ]=(string)curl_multi_getcontent( $curl [ $k ]);
|
34
|
}
|
35
|
curl_multi_remove_handle( $handle , $curl [ $k ]);
|
36
|
curl_close( $curl [ $k ]);
|
37
|
}
|
38
|
curl_multi_close( $handle );
|
39
|
return $text ;
|
40
|
}
|
另外我对CURL_MULTI类的函数也做了一下小小的总结,通过查看php手册文档会找出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_multi_init初始化一个curl批处理句柄资源
第二步:循环调用curl_multi_add_handle向curl批处理会话中添加单独的curl句柄资源(这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle)
第三步:持续调用curl_multi_exec解析curl批处理句柄
第四步:根据需要循环调用curl_multi_getcontent返回获取的输出的文本流以获取结果
第五步:调用curl_multi_remove_handle移除curl批处理句柄资源中的某个句柄资源,并为每个handle调用curl_close
第六步:调用curl_multi_close关闭批处理句柄资源
另外需要注意的是PHP 5 版本才可以使用这个函数,必须开启 curl 扩展(打开 php.ini 把;extension=php_curl.dll前面的分号去掉 , 重启apache 就可以使用了)。
PHP利用CURL_MULTI实现多线程相关推荐
- PHP利用CURL_MULTI实现多线程爆破
在上一篇文章http://blog.csdn.net/ls1120704214/article/details/49734883的最后我尝试着使用PHP进行我的爆破实验,结果也在最后贴出来了... 第 ...
- Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...
- C#中利用委托实现多线程跨线程操作
在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...
- python多线程url采集器 + github_利用Python3.5多线程抓取妹子图
很久之前就写了这个爬妹子图的Python爬虫,并且开源到Github上,然而居然没有人给小心心,虽然现在失效了,妹子图网站开启了反爬虫机制,但还是可以作为大家学习的样例,注释也很清晰. 0x01 起因 ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- PHP Curl 多线程实现
2019独角兽企业重金招聘Python工程师标准>>> 使用方法: $urls = array("http://baidu.com", "http:// ...
- Redis 6.0 新特性-多线程连环13问!
来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...
- libevent多线程
利用libevent和多线程 实现多并发的服务器的设计.主进程监听连接的到来使用一个base,进行事件循环.每当 一个连接进来时,创建一个新的线程实现与客户端之间的通信,子线程建立一个base,进行事 ...
- 计算机网络多线程通信,多线程技术的PLC与PC的通讯方式
基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心,是上位机.其主要利用良好的图形用户界面,显示从PLC接收的开关量和控制手柄的位置,进行一 ...
最新文章
- mysql 1215_mysql执行带外键的sql文件时出现mysql ERROR 1215 (HY000): Cannot add foreign key constraint的解决...
- 十、Mysql执行计划详细解析
- Hyperledger Fabric Endorsement policies——背书策略
- MTK改串工具,mtk刷机工具,高通刷机工具,MTK生成线刷包工具资料下载
- coreldraw铺花纹_Coreldraw绘图实例教程,教你cdr环形花边绘制方法
- batchplot插件用法_Batchplot设置使用指南,实现批量打印CAD图纸
- 九种NPP\GPP数据集介绍和下载
- 568A和568B的线序
- CSS外边距塌陷问题,吊打面试官
- [树 乱搞] BZOJ 4238 电压
- 山东平度纵火案告破:村主任与地产商联手施暴
- LandSat8遥感影像辐射定标与大气校正
- Eureka相关总结
- Linux—文件系统与磁盘管理(后)
- mailto的用法及attach附件测试结果。
- Rasa 使用ResponseSelector实现FAQ和闲聊
- Python分析香港26281套在售二手房数据
- js,工具方法,正则表达式判断是否为英文单词
- web:常见安全问题
- amd锐龙笔记本cpu怎么样_AMD发布两款锐龙笔记本CPU
热门文章
- iOS培训教程——设置默认语言
- AB_PLC_入门教程
- 64位环境启用ASP.net 2.0的32位扩展
- 区块链开发: 2019年及以后数字货币的前景如何?
- 字典树(前缀树)-Java实现
- Font from origin 'http://apps.bdimg.com' has been blocked
- Redis源码试读(一)源码准备
- 1.mysql数据库安装不成功的解决方案
- 【LINUX 学习】Ext3 的三种日志记录方式
- Ubuntu 14.04使用命令行安装VirtualBox