`

使用curl实现多线程

    博客分类:
  • PHP
 
阅读更多

使用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

多线程的测试效果图:

wps_clip_image-11562

总结:36个http请求,从执行的是时间顺序上来看,三个网站的ip交叉,说明是同时并发的!

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    CURL多线程类库

    使用这个CURL多线程类库,开发者可以实现批量下载、数据抓取、分布式爬虫等多种复杂场景,大大提高PHP处理网络请求的效率。需要注意的是,在实际应用中,应考虑服务器资源限制,合理设置线程数量,避免过度消耗内存...

    php利用curl实现多线程类.zip

    在这种情况下,单线程的请求方式效率低下,而利用curl实现多线程可以显著提高处理速度。本文将深入探讨如何在PHP中利用curl创建多线程类,以提升程序的性能。 首先,我们要理解curl在PHP中的作用。cURL是客户端URL...

    php利用curl实现多线程下载图片类.zip

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。

    curl线程池多线程调用

    在`curl`中,可以通过并行运行多个`curl`进程来实现多线程效果,每个进程负责一个独立的网络请求。 2. **线程池**:线程池是一种线程管理机制,它预先创建了一组线程,当有新的任务需要执行时,线程池会从已存在的...

    php curl 多线程实现-php程序员的笔记

    php curl 多线程实现-php程序员的笔记

    php利用curl实现多线程下载图片类

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。

    PHP使用CURL实现多线程抓取网页

    PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,不过可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url...

    PHP 利用Curl实现多线程抓取网页和下载文件

    本文将探讨如何利用PHP中的cURL库实现多线程抓取网页内容和下载文件,这是构建高效网络爬虫和数据抓取系统的关键技术。通过多线程,我们可以并行处理多个任务,显著提高工作效率。 首先,cURL是PHP的一个扩展,它...

    curl-7.37.0简单下载多线程下载断点续载范例_非常简洁

    但是,可以结合外部工具如 `axel` 或 `aria2` 实现多线程下载。比如使用 `aria2c`: ```bash aria2c -x 5 -j 5 http://example.com/file.zip ``` 这里 `-x` 指定下载时的连接数,`-j` 指定同时进行的任务数。请...

    php结合curl实现多线程抓取

    在PHP中,我们可以利用cURL库来实现多线程数据抓取,这在处理大量网页数据...以上就是PHP结合cURL实现多线程抓取的基本原理和示例。通过这个技术,开发者可以在处理大量网页数据时提高效率,实现更高效的数据抓取任务。

    php的curl多线程采集.zip

    在PHP中,我们可以使用`pthreads`扩展来实现多线程。然而,`pthreads`并不适用于所有PHP环境,因为它只在 Zend 引擎支持线程安全的版本中可用,通常在CLI模式下运行的PHP才会开启这个功能。 在进行多线程cURL采集时...

    PHP使用CURL_MULTI实现多线程采集的例子

    在给出的例子中,可以看到如何使用CURL_MULTI实现多线程采集的步骤: 1. **初始化**: 首先,创建一个cURL多会话句柄`$handle`,通过`curl_multi_init()`函数完成。 2. **创建并配置cURL句柄**: 对于每个需要访问的...

    CurlMulti 一个php多线程类库

    提供的"CurlMulti-master"可能是该多线程库的一个版本或者示例代码仓库,包含类库的源码和其他相关文件,供开发者下载学习和应用到自己的项目中。下载后,可以通过阅读源码了解其实现细节,并根据实际需求进行定制...

    php的curl多线程采集

    在PHP中,`cURL`库是一个强大的工具,用于处理HTTP和其他协议的传输。...通过以上方法,可以实现高效的PHP `cURL`多线程采集,但要注意遵守互联网使用规范,尊重目标网站的robots.txt规则,避免过度抓取导致IP被封禁。

    php使用curl模拟多线程实现批处理功能示例

    本文实例讲述了php使用curl模拟多线程实现批处理功能。分享给大家供大家参考,具体如下: php模拟多线程用到curl库,这个库很强大,可以做好多事,比如模拟登陆,文件上传/下载,数据采集等。 下面是我的代码,很简单...

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

    总结起来,使用`curl`的多线程功能可以有效地并发处理多个网络请求,通过`curl_multi_init`、`curl_multi_add_handle`、`curl_multi_exec`等函数组合,可以构建出高效的数据抓取或请求系统。同时,通过合理地使用`...

    PHP用法CURL_MULTI实现多线程采集的例子_.docx

    本文将详细介绍如何使用PHP的`CURL_MULTI`实现多线程数据采集,并分析其在性能优化上的优势。 首先,我们来看一个简单的`CURL_MULTI`实例,用于同时从多个URL获取数据: ```php $text = remote(['...

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

    PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...

Global site tag (gtag.js) - Google Analytics