PHP多线程之内部多线程实例分析


Posted in PHP onMarch 09, 2015

本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下:

<?php

class Http_MultiRequest

{

    //要并行抓取的url 列表

    private $urls = array();

    //curl 的选项

    private $options;

    //构造函数

    function __construct($options = array())

    {

        $this->setOptions($options);

    }

    //设置url 列表

    function setUrls($urls)

    {

        $this->urls = $urls;

        return $this;

    }

    //设置选项

    function setOptions($options)

    {

        $options[CURLOPT_RETURNTRANSFER] = 1;

        if (isset($options['HTTP_POST'])) 

        {

            curl_setopt($ch, CURLOPT_POST, 1);

            curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);

            unset($options['HTTP_POST']);

        }

        if (!isset($options[CURLOPT_USERAGENT])) 

        {

            $options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)';

        }

        if (!isset($options[CURLOPT_FOLLOWLOCATION])) 

        {

            $options[CURLOPT_FOLLOWLOCATION] = 1;

        }

        if (!isset($options[CURLOPT_HEADER]))

        {

            $options[CURLOPT_HEADER] = 0;

        }

        $this->options = $options;

    }

    //并行抓取所有的内容

    function exec()

    {

        if(empty($this->urls) || !is_array($this->urls))

        {

            return false;

        }

        $curl = $data = array();

        $mh = curl_multi_init();

        foreach($this->urls as $k => $v)

        {

            $curl[$k] = $this->addHandle($mh, $v);

        }

        $this->execMulitHandle($mh);

        foreach($this->urls as $k => $v)

        {

            $data[$k] = curl_multi_getcontent($curl[$k]);

            curl_multi_remove_handle($mh, $curl[$k]);

        }

        curl_multi_close($mh);

        return $data;

    }

    //只抓取一个网页的内容。

    function execOne($url)

    {

        if (empty($url)) {

            return false;

        }

        $ch = curl_init($url);

        $this->setOneOption($ch);

        $content = curl_exec($ch);

        curl_close($ch);

        return $content;

    }

    //内部函数,设置某个handle 的选项

    private function setOneOption($ch)

    {

        curl_setopt_array($ch, $this->options);

    }

    //添加一个新的并行抓取 handle

    private function addHandle($mh, $url)

    {

        $ch = curl_init($url);

        $this->setOneOption($ch);

        curl_multi_add_handle($mh, $ch);

        return $ch;

    }

    //并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法

    //下载一个小文件都可能导致cup占用100%, 并且,这个循环会运行10万次以上

    //这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。)

    private function execMulitHandle($mh)

    {

        $running = null;

        do {

            curl_multi_exec($mh, $running);

        } while ($running > 0);

    }

}

/*下面是上面的类的一个测试的例子:*/

$urls = array("http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://www.google.com", "http://www.sina.com.cn", );

$m = new Http_MultiRequest();

$t = microtime(true);

$m->setUrls($urls);

//parallel fetch(并行抓取):

$data = $m->exec();

$parallel_time = microtime(true) - $t;

echo $parallel_time . "\n";

$t = microtime(true);

//serial fetch(串行抓取):

foreach ($urls as $url)

{

    $data[] = $m->execOne($url);

}

$serial_time = microtime(true) - $t;

echo $serial_time . "\n";

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
php实现简单洗牌算法
Jun 18 PHP
php写的AES加密解密类分享
Jun 20 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
php数组添加元素方法小结
Dec 20 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
PHP实现登录验证码校验功能
May 17 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
Sep 10 PHP
php如何实现数据库的备份和恢复
Nov 30 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 #PHP
php建立Ftp连接的方法
Mar 07 #PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 #PHP
PHP实现懒加载的方法
Mar 07 #PHP
php根据某字段对多维数组进行排序的方法
Mar 07 #PHP
PHP多线程编程之管道通信实例分析
Mar 07 #PHP
PHP查询快递信息的方法
Mar 07 #PHP
You might like
Php注入点构造代码
2008/06/14 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
jquery自定义表格样式
2015/11/23 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
python处理html转义字符的方法详解
2016/07/01 Python
Python类的继承和多态代码详解
2017/12/27 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
python简单实现AES加密和解密
2019/03/28 Python
python实现大量图片重命名
2020/03/23 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python数据分析:关键字提取方式
2020/02/24 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
yy婚礼主持词
2014/03/14 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
励志演讲稿500字
2014/08/21 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书