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 编程安全性小结
Jan 08 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
Apr 13 PHP
php字符串倒叙
Apr 01 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
jquery删除数组中重复元素
2016/12/05 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
python构造IP报文实例
2020/05/05 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
创联软件面试题笔试题
2012/10/07 面试题
新学期红领巾广播稿
2014/01/14 职场文书
大学生个人事迹材料
2014/01/21 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
社区工作者感言
2014/03/02 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
草房子读书笔记
2015/06/29 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
python 提取html文本的方法
2021/05/20 Python
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
Python使用Web框架Flask开发项目
2022/06/01 Python