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 02 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
php define的第二个参数使用方法
Nov 04 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
PHP实现的操作数组类库定义与用法示例
May 24 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
通过html表格发电子邮件
2006/10/09 PHP
mysql总结之explain
2012/02/27 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python三元运算符实现方法
2013/12/17 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
python提取字典key列表的方法
2015/07/11 Python
python实现两个文件合并功能
2018/04/01 Python
Python类装饰器实现方法详解
2018/12/21 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
公立医院改革实施方案
2014/03/14 职场文书
房屋出租协议书
2014/04/10 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js