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
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 PHP
set_exception_handler函数在ThinkPHP中的用法
Oct 31 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP实现微信提现功能
2018/09/30 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
javascript模拟命名空间
2015/04/17 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python生成日历实例解析
2014/08/21 Python
使用python实现省市三级菜单效果
2016/01/20 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python模拟实现分发扑克牌
2020/04/22 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
集团薪酬管理制度
2014/01/13 职场文书
宣传工作经验材料
2014/06/02 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
社区义诊通知
2015/04/24 职场文书