PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就一个利用PHP CURL_MULTI多线程采集网页为例来说明一下。
02 |
//功能:PHP利用CURL_MULTI多线程采集网页函数 |
05 |
function remote($urls){ |
06 |
if(!is_array($urls)||!count($urls)){ |
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]); |
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){ |
26 |
$mrc=curl_multi_exec($handle,$active); |
27 |
}while($mrc==CURLM_CALL_MULTI_PERFORM); |
31 |
foreach($curl as $k=>$v){ |
32 |
if(curl_error($curl[$k])==""){ |
33 |
$text[$k]=(string)curl_multi_getcontent($curl[$k]); |
35 |
curl_multi_remove_handle($handle,$curl[$k]); |
36 |
curl_close($curl[$k]); |
38 |
curl_multi_close($handle); |
另外我对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实现多线程抓取网页和下载文件
PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...
- C#中利用委托实现多线程跨线程操作
在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...
- 利用ipython实现多线程
多线程来批量化处理数据的时候希望简单的应用,使用ipython会很简单 参考这里
- 利用httpclient和多线程刷訪问量代码
缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- 利用curl 模拟多线程
所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. f ...
- 利用Python实现多线程聊天功能
#-*- coding:utf-8 -*- from threading import Thread from socket import * #1.实现接收消息 def recvDate(): wh ...
- 利用Condition实现多线程交替执行
一.需求 A.B.C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC... A.B.C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCC ...
- PHP使用CURL_MULTI实现多线程采集
$connomains = array( "http://www.baidu.com/", "http://www.hao123.com/", "ht ...
随机推荐
- MongoDB索引相关文章-摘自网络
索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique).稀疏索引(sparse).多值索引(multikey)等几种类型. 唯一索引 唯 ...
- rocketMq排坑:如何设置rocketMq broker的ip地址
在工作中遇到了一个这个问题,就是我们rocketmq是部署在云主机上的 但是我们的开发同事在自己的电脑连接rocketmq链接不上 报错显示Caused by: org.apache.rocketmq ...
- android开发前奏曲之开发工具ADT
原文:http://android.eoe.cn/topic/android_sdk Android开发工具(ADT)插件为Eclipse提供了一个专业级的开发环境,用于构建Android应用程序.这 ...
- vim快速指南
vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握这三种模式十分重要: 命令模式:vi启动后默认进入的是命令模式,任何模式下,按[Esc]键都可以返回命令模式.输入模式:可输入字符,在底部显示“ ...
- 菜鸟调错(三)——Jboss与jdk版本不兼容导致WebService调用出错
环境: jdk1.6 Jboss 5.1.0.GA 问题描述: EJB发布webserivce已经成功,并且能够成功访问wsdl文件: 使用axis1自带的sample/client下的类Dynami ...
- linux系统卡解决方案
1.查看内存使用率 free -g 运行结果: 2.查看磁盘使用率 df -h 运行结果: 3.查看磁盘IO iostat -x 1 运行结果: 60表示60秒钟刷新一次 4.查看CPU使用情况 to ...
- iOS-图片浏览器(字典和plist文件的使用)
// // ViewController.m // 19-图片浏览器 // // Created by hongqiangli on 2017/7/31. // Copyright © 201 ...
- 【转】(三)unity4.6Ugui中文教程文档-------概要-UGUI Basic Layout
原创至上,移步请戳:(三)unity4.6Ugui中文教程文档-------概要-UGUI Basic Layout 2. BasicLayout 在这一节我们会看到UI元素相对于画布的位置是怎样的. ...
- 【Linux技术】ubuntu常用命令
查看软件xxx安装内容:dpkg -L xxx查找软件库中的软件:apt-cache search 正则表达式查找软件库中的软件:aptitude search 软件包查找文件属于哪个包:dpkg - ...
- SpringBoot整合SpringKafka实现消费者史上最简代码实现
该项目是使用的技术:SpringBoot + SpringKafka + Maven 先看pom.xml文件中引入的依赖: <?xml version="1.0" enco ...