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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
main.php
Dec 09 PHP
PHP新手入门学习方法
May 08 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
php实现天干地支计算器示例
Mar 14 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
详解thinkphp中的volist标签
Jan 15 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 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 curl使用实例
2015/07/02 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
报关报检委托书
2014/04/08 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
教育合作协议范本
2014/10/17 职场文书
玄武湖导游词
2015/02/05 职场文书
教师节慰问信
2015/02/15 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS