使用curl实现多线程
curl一般用来抓取网页,第二种就是get或者post数据,第三种应用就是实现PHP的多线程任务
下面来实现多线程的
可以返回:
- URLINFO_EFFECTIVE_URL – 最后一个有效的URL地址
- CURLINFO_HTTP_CODE – 最后一个收到的HTTP代码
- CURLINFO_FILETIME – 远程获取文档的时间,如果无法获取,则返回值为“-1”
- CURLINFO_TOTAL_TIME – 最后一次传输所消耗的时间
- CURLINFO_NAMELOOKUP_TIME – 名称解析所消耗的时间
- CURLINFO_CONNECT_TIME – 建立连接所消耗的时间
- CURLINFO_PRETRANSFER_TIME – 从建立连接到准备传输所使用的时间
- CURLINFO_STARTTRANSFER_TIME – 从建立连接到传输开始所使用的时间
- CURLINFO_REDIRECT_TIME – 在事务传输开始前重定向所使用的时间
- CURLINFO_SIZE_UPLOAD – 上传数据量的总值
- CURLINFO_SIZE_DOWNLOAD – 下载数据量的总值
- CURLINFO_SPEED_DOWNLOAD – 平均下载速度
- CURLINFO_SPEED_UPLOAD – 平均上传速度
- CURLINFO_HEADER_SIZE – header部分的大小
- CURLINFO_HEADER_OUT – 发送请求的字符串
- CURLINFO_REQUEST_SIZE – 在HTTP请求中有问题的请求的大小
- CURLINFO_SSL_VERIFYRESULT – 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
- CURLINFO_CONTENT_LENGTH_DOWNLOAD – 从Content-Length: field中读取的下载内容长度
- CURLINFO_CONTENT_LENGTH_UPLOAD – 上传内容大小的说明
- CURLINFO_CONTENT_TYPE – 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type: header
<?php /* curl 多线程抓取 */ /** * curl 多线程 * * @param array $array 并行网址 * @param int $timeout 超时时间 * @return array */ function Curl_http($array,$timeout){ $res = array(); $mh = curl_multi_init();//创建多个curl语柄 $startime = getmicrotime(); foreach($array as $k=>$url){ $conn[$k]=curl_init($url); curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间 curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别 curl_setopt($conn[$k], CURLOPT_HEADER, 0);//这里不要header,加块效率 curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1); curl_multi_add_handle ($mh,$conn[$k]); } //防止死循环耗死cpu 这段是根据网上的写法 do { $mrc = curl_multi_exec($mh,$active);//当无数据,active=true } while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时 while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ($array as $k => $url) { curl_error($conn[$k]); $res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息 $header[$k]=curl_getinfo($conn[$k]);//返回头信息 curl_close($conn[$k]);//关闭语柄 curl_multi_remove_handle($mh , $conn[$k]); //释放资源 } curl_multi_close($mh); $endtime = getmicrotime(); $diff_time = $endtime - $startime; return array('diff_time'=>$diff_time, 'return'=>$res, 'header'=>$header ); } //计算当前时间 function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } //测试一下,curl 三个网址 $array = array( "http://www.weibo.com/", "http://www.renren.com/", "http://www.qq.com/" ); $data = Curl_http($array,'10');//调用 var_dump($data);//输出 ?>
关于do while的那段解释:
因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,
当有数 据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。
这里的好处就是CPU的无谓 消耗没有了。更详细的说明:http://hi.baidu.com/%D4%C2%D2%B9%C4%FD%ED%F8/blog/item/9dfcf4fbe6b84374024f563d.html
这个多线程的写法步骤:
第一步:调用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
多线程的测试效果图:
总结:36个http请求,从执行的是时间顺序上来看,三个网站的ip交叉,说明是同时并发的!
发表评论
-
Yaf框架安装指南
2018-06-29 15:44 621http://www.php.cn/php-weizij ... -
phpize是干嘛的 phpize的深入理解
2018-06-29 15:11 423安装(fastcgi模式)的时候,常常有这样一句命令:/usr ... -
php-cgi和php-fpm有什么关系
2018-06-20 16:43 520转:https://segmentfault ... -
php strip_tags 去HTML标记
2018-06-06 13:32 586只保留 p img 换行符 $c ... -
thinkphp3.2.3用redis3.0.7做session共享
2017-12-28 15:08 1029第一步:在主服务器(www服务器)和从服务器上安装red ... -
php 如何给关键词自动添加超链接
2017-02-24 13:04 738$string = "a a b b c c&qu ... -
php 去掉字符串的最后一个字符 及 截取
2016-10-26 16:48 785原字符串1,2,3,4,5,6, 去掉最后一个 ... -
php 获取月第一天和最后一天
2016-07-20 13:42 486PHP获取某一天前后任意时间 date(" ... -
PHP 过滤,替换 超链接
2014-06-09 14:19 678#过滤掉超链接 ereg_replace("&l ... -
PHP二维数组排序函数
2014-04-10 17:31 784#对二维数组进行排序,$keys就是要排序的键名, 第三参 ... -
一组PHP可逆加密解密算法
2014-04-10 17:20 664对于大部分密码加密,我们可以采用md5、sha1等方法。可以 ... -
php在linux系统下实现百度文库功能 doc或pdf转swf预览功能
2013-07-30 15:29 1502php在linux系统下实现百度文库功能 doc或pdf转s ... -
msql 只查年月日
2013-03-15 10:18 872msql 只查年月日 where TO_DA ... -
使用PHP+Sphinx建立高效的站内搜索引擎
2013-03-11 15:07 9011. 为什么要使用Sphinx 假设你现在运营 ... -
ThinkPHP模板运用指南
2012-10-18 10:44 1576使用例子: {$webTitle|md5|strtou ... -
文件夹不存在则创建
2012-10-10 16:25 0#文件夹不存在则创建 private function cr ... -
thinkPHP中CURD
2012-09-13 17:36 2435thinkPHP中CURD 一:thinkPHP中多 ... -
文件夹不存在则创建
2012-08-29 16:20 913#文件夹不存在则创建 private function cr ... -
test
2012-08-09 16:19 0DROP TABLE IF EXISTS `city`; ... -
TP 路由
2012-07-31 23:15 752/*路由定义*/ 'URL_ROUTE_RULES ...
相关推荐
使用这个CURL多线程类库,开发者可以实现批量下载、数据抓取、分布式爬虫等多种复杂场景,大大提高PHP处理网络请求的效率。需要注意的是,在实际应用中,应考虑服务器资源限制,合理设置线程数量,避免过度消耗内存...
在这种情况下,单线程的请求方式效率低下,而利用curl实现多线程可以显著提高处理速度。本文将深入探讨如何在PHP中利用curl创建多线程类,以提升程序的性能。 首先,我们要理解curl在PHP中的作用。cURL是客户端URL...
通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。
在`curl`中,可以通过并行运行多个`curl`进程来实现多线程效果,每个进程负责一个独立的网络请求。 2. **线程池**:线程池是一种线程管理机制,它预先创建了一组线程,当有新的任务需要执行时,线程池会从已存在的...
php curl 多线程实现-php程序员的笔记
通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。
PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,不过可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url...
本文将探讨如何利用PHP中的cURL库实现多线程抓取网页内容和下载文件,这是构建高效网络爬虫和数据抓取系统的关键技术。通过多线程,我们可以并行处理多个任务,显著提高工作效率。 首先,cURL是PHP的一个扩展,它...
但是,可以结合外部工具如 `axel` 或 `aria2` 实现多线程下载。比如使用 `aria2c`: ```bash aria2c -x 5 -j 5 http://example.com/file.zip ``` 这里 `-x` 指定下载时的连接数,`-j` 指定同时进行的任务数。请...
在PHP中,我们可以利用cURL库来实现多线程数据抓取,这在处理大量网页数据...以上就是PHP结合cURL实现多线程抓取的基本原理和示例。通过这个技术,开发者可以在处理大量网页数据时提高效率,实现更高效的数据抓取任务。
在PHP中,我们可以使用`pthreads`扩展来实现多线程。然而,`pthreads`并不适用于所有PHP环境,因为它只在 Zend 引擎支持线程安全的版本中可用,通常在CLI模式下运行的PHP才会开启这个功能。 在进行多线程cURL采集时...
在给出的例子中,可以看到如何使用CURL_MULTI实现多线程采集的步骤: 1. **初始化**: 首先,创建一个cURL多会话句柄`$handle`,通过`curl_multi_init()`函数完成。 2. **创建并配置cURL句柄**: 对于每个需要访问的...
提供的"CurlMulti-master"可能是该多线程库的一个版本或者示例代码仓库,包含类库的源码和其他相关文件,供开发者下载学习和应用到自己的项目中。下载后,可以通过阅读源码了解其实现细节,并根据实际需求进行定制...
在PHP中,`cURL`库是一个强大的工具,用于处理HTTP和其他协议的传输。...通过以上方法,可以实现高效的PHP `cURL`多线程采集,但要注意遵守互联网使用规范,尊重目标网站的robots.txt规则,避免过度抓取导致IP被封禁。
本文实例讲述了php使用curl模拟多线程实现批处理功能。分享给大家供大家参考,具体如下: php模拟多线程用到curl库,这个库很强大,可以做好多事,比如模拟登陆,文件上传/下载,数据采集等。 下面是我的代码,很简单...
总结起来,使用`curl`的多线程功能可以有效地并发处理多个网络请求,通过`curl_multi_init`、`curl_multi_add_handle`、`curl_multi_exec`等函数组合,可以构建出高效的数据抓取或请求系统。同时,通过合理地使用`...
本文将详细介绍如何使用PHP的`CURL_MULTI`实现多线程数据采集,并分析其在性能优化上的优势。 首先,我们来看一个简单的`CURL_MULTI`实例,用于同时从多个URL获取数据: ```php $text = remote(['...
PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...