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 addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
php htmlentities()函数的定义和用法
May 13 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
php图片添加水印例子
Jul 20 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
php实现的树形结构数据存取类实例
2014/11/29 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
Sublime开发python程序的示例代码
2018/01/24 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
详解Python中is和==的区别
2019/03/21 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
博士学位自我鉴定范文
2013/12/26 职场文书
毕业生求职信范文
2014/06/29 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
商务经理岗位职责
2014/08/03 职场文书
组工干部对照检查材料
2014/08/25 职场文书
庆祝教师节主题班会
2015/08/17 职场文书