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

每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。

//设置缓冲为0(也可以去php.ini设置)
ini_set('output_buffering', 0);
//打开输出缓冲区
ob_start();
//设置一个空数组
$curl_Arr=[];
//这里模拟20次请求
for($i=0;$i<20;$i++){
 //开启curl连接
 $curl_Arr[$i]=curl_init("http://XXXX/test.php");
 //CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
 curl_setopt($curl_Arr[$i],CURLOPT_RETURNTRANSFER,1);
}

//创建批处理cURL句柄
$mh = curl_multi_init();

foreach($curl_Arr as $k => $ch){
 //curl句柄入栈增加
 curl_multi_add_handle($mh,$ch);
}
$active = null;
while(count($curl_Arr)>0){
 //发起curl_multi请求
 @curl_multi_exec($mh,$active);
 foreach($curl_Arr as $k => $ch){
  //获取句柄的返回值
  if($result[$k]= curl_multi_getcontent($ch)){
   //输出结果
   echo "$result[$k]\n";
   ob_flush();
   //把被释放的数据发送到浏览器
   flush();
   //关闭该句柄
   curl_multi_remove_handle($mh,$ch);
   unset($curl_Arr[$k]);
  }
 }
}
//关闭ouput_buffering机制
ob_end_flush();
//关闭"curl_mulit"句柄
curl_multi_close($mh);

我再服务器上建立一起请求的php页面命名为test.php,内容如下

1 sleep(10);
2 echo 'seccess';exit;

表示等待十秒后数据下面语句。
然后我在命令行执行该程序结果如下:

上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。
该模拟多线程实现是通过使用curl的curl_multi系列函数能实现此功能的。至于该系列函数使用介绍,百度一搜一大把。这里就不做说明了。

以上所述是小编给大家介绍的php使用curl模拟多线程发送请求详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • PHP Curl多线程原理实例详解

    给各位介绍一下Curl多线程实例与原理.不对之处请指教相信许多人对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

  • php结合curl实现多线程抓取

    php结合curl实现多线程抓取 <?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(); fo

  • php使用curl_init()和curl_multi_init()多线程的速度比较详解

    本文实例讲述了php使用curl_init()和curl_multi_init()多线程的速度比较.分享给大家供大家参考,具体如下: php中curl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候,例如之前文章<php使用curl获取header检测开启GZip压缩>就介绍到curl_init()的强大. curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么php里提供了一个函数curl_multi_init()给我们,这就是多线程模式处理事务的函数

  • php中foreach结合curl实现多线程的方法分析

    本文实例讲述了php中foreach结合curl实现多线程的方法.分享给大家供大家参考,具体如下: 多线程是php不支持的但我们可以通过foreach来伪多线程了,但这个伪多线程速度不一定比单线程要单到哪里去了,具体来看个例子. 在利用foreach语句循环图片URL,并通过CURL将所有图片进行本地保存的函数时,出现了只能采集到一个的问题,现将foreach和CURL结合进行多URL请求的方法进行下总结. 方法1:循环请求 $sr=array(url_1,url_2,url_3); forea

  • PHP CURL 多线程操作代码实例

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

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

    这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的.同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助! 复制

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

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Curl Multi Functions 它可以实现并发多线程的访问多个url地址.既然 Curl Multi Function如此强大,能否用 Curl Multi Functions 来写并发多线程下载文件呢,当然可以,下面给出我的代码: 代码1:将获得的代码直接写入某个文件 <?php $urls

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

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

  • 浅谈Java的两种多线程实现方式

    本文介绍了浅谈Java的两种多线程实现方式,分享给大家.具有如下: 一.创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2 通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 程序1

  • 浅谈php中curl、fsockopen的应用

    最近要用到通过post上传文件,网上盛传的有curl的post提交和fsockopen,其中curl最简单,于是从最简单的说起. 这是简单的将一个变量post到另外一个页面 $url = ''; $data = array('a'=> 'b'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_

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

    本文实例讲述了php使用curl模拟多线程实现批处理功能.分享给大家供大家参考,具体如下: php模拟多线程用到curl库,这个库很强大,可以做好多事,比如模拟登陆,文件上传/下载,数据采集等. 下面是我的代码,很简单,有些还功能还不会用. <?php $node_urls=array('http://www.baidu.com','http://www.google.com.hk'); $ch=array(); $mh=curl_multi_init(); $ch[0]=curl_init($

  • 浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法

    在HTTP POST请求中,我们多次在View和Controller中看下如下代码: 1.View中调用了Html.AntiForgeryToken(). 2.Controller中的方法添加了[ValidateAntiForgeryToken]注解. 这样看似一对的写法其实是为了避免引入跨站请求伪造(CSRF)攻击. 这种攻击形式大概在2001年才为人们所认知,2006年美国在线影片租赁网站Netflix爆出多个CSRF漏洞,2008年流行的视频网址YouTube受到CSRF攻击,同年墨西哥一

  • java模拟多线程http请求代码分享

    java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 实例代码: package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.Exec

  • 浅谈Qt实现HTTP的Get/Post请求

    目录 头文件 Get Post 借助Qt的NetWork模块,可以轻松的实现HTTP的Get/Post请求,而不需要再次引用像libcurl这样的第三方库.当然,Qt的NetWork模块提供的功能远远不只是HTTP方面的. 头文件 #include <QNetworkRequest> #include <QNetworkReply> #include <QNetworkAccessManager> 另外,使用Qt网络模块还需要引用Qt5Network.lib库. Get

  • 在python中使用requests 模拟浏览器发送请求数据的方法

    如下所示: import requests url='http://####' proxy={'http':'http://####:80'} headers={ "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Accept-Lang

  • java爬虫之使用HttpClient模拟浏览器发送请求方法详解

    0. 摘要 0.1 添加依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> 0.2 代码 //1. 打开浏览器 创建httpclient对象 CloseableHttpClient httpCl

  • 浅谈PHP封装CURL

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS.CURL可以根据URL前缀是"HTTP" 还是"HTTPS"自动选择是否加密发送内容. 使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始化连接句柄: 2.设置CURL选项: 3.执行并获取结果: 4.释放VURL连接句柄. PHP.in

随机推荐