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 相关文章推荐
如何对PHP程序中的常见漏洞进行攻击(下)
Oct 09 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
用PHP实现的生成静态HTML速度快类库
Mar 31 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP+jQuery实现自动补全功能源码
May 15 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
PHP经典实用正则表达式小结
May 04 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
thinkphp5使用无限极分类
Feb 18 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实现二分查找算法代码分享
2011/06/24 PHP
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
轮播图组件js代码
2016/08/08 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
副总经理岗位职责
2014/03/16 职场文书
房产委托公证书样本
2014/04/04 职场文书
忠诚教育心得体会
2014/09/03 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
网络销售员岗位职责
2015/04/11 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
Redis如何实现分布式锁
2021/08/23 Redis
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL