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 iconv函数的使用详解
Jun 09 PHP
php权重计算方法代码分享
Jan 09 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
php在数组中查找指定值的方法
Mar 17 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 PHP
PHP序列化操作方法分析
Sep 28 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 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如何调用webservice应用介绍
2012/11/24 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
2015/03/25 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
jquery.masonry瀑布流效果
2017/05/25 jQuery
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
通过Python实现自动填写调查问卷
2017/09/06 Python
Python模块搜索路径代码详解
2018/01/29 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
台湾生鲜宅配:大口市集
2017/10/14 全球购物
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
网络书店创业计划书
2014/02/07 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
商场促销活动策划方案
2014/08/18 职场文书
邓小平理论心得体会
2014/09/09 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
卖房协议书样本
2014/10/30 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
box-shadow单边阴影的实现
2023/05/21 HTML / CSS