PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就一个利用PHP CURL_MULTI多线程采集网页为例来说明一下。

01 <?php
02 //功能:PHP利用CURL_MULTI多线程采集网页函数
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实现多线程的更多相关文章

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

    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...

  2. C#中利用委托实现多线程跨线程操作

    在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...

  3. 利用ipython实现多线程

    多线程来批量化处理数据的时候希望简单的应用,使用ipython会很简单 参考这里

  4. 利用httpclient和多线程刷訪问量代码

    缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...

  5. 利用GDB进行多线程调试

    一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...

  6. 利用curl 模拟多线程

    所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. f ...

  7. 利用Python实现多线程聊天功能

    #-*- coding:utf-8 -*- from threading import Thread from socket import * #1.实现接收消息 def recvDate(): wh ...

  8. 利用Condition实现多线程交替执行

    一.需求 A.B.C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC... A.B.C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCC ...

  9. PHP使用CURL_MULTI实现多线程采集

    $connomains = array( "http://www.baidu.com/", "http://www.hao123.com/", "ht ...

随机推荐

  1. 批量修改Mysql数据库表Innodb为MyISAN

    mysql -uroot -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_s ...

  2. 星云 Android 开发工具箱

    Toast 工具类: SmartToastUtils.java import android.content.Context; import android.widget.Toast; /** * T ...

  3. [nginx]盗链和防盗链场景模拟实现

    盗链环境模拟 http://www.daolian.com/index.html 这个页面盗用http://www.maotai.com/qq.jpg这个站点页面的图. <!doctype ht ...

  4. 正确安全清空在线慢查询日志slow log的流程

    查看慢查询日志的状态: mysql> show variables like '%slow%'; +---------------------+------------------------- ...

  5. .NET MVC5+ EF+AutoFac自动注入框架

    1.创建一个MVC系统 VIEW显示页面代码: <link href="~/Content/bootstrap.css" rel="stylesheet" ...

  6. 解决windows10 里vs2015 附件进程调试提示“此任务要求应用程序有提升的权限”

    刚用windows10 ,感觉有些地方别扭.就在是vs2015开发程序的时候,就遇到了个问题. 首先 我是使用adminitrator账号登陆的. 双击vs解决方案,打开iis,然后结合vs2015里 ...

  7. C++操作符的优先级 及其记忆方法

    优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作 ...

  8. python(36):python日志打印,保存,logging模块学习

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  9. 【MySQL】MySQL在CentOS的搭建

    安装mysql 查询yum服务器上可用的关于mysql的安装包: [root@localhost ~]# yum list | grep mysql mysql-libs.x86_64 5.1.71- ...

  10. __slots__ Python Class限制添加属性

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...