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和XSL stylesheets转换XML文档
Oct 09 PHP
层叠菜单的动态生成
Oct 09 PHP
火车头采集器3.0采集图文教程
Mar 17 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
PHP7.0安装笔记整理
Aug 28 PHP
Zend Framework入门知识点小结
Mar 19 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
PHP获取真实IP及IP模拟方法解析
Nov 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
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
解决GD中文乱码问题
2007/02/14 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
javaScript arguments 对象使用介绍
2013/10/18 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
js实现导航跟随效果
2018/11/17 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python发送Email方法实例
2014/08/21 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
Python读取yaml文件的详细教程
2020/07/21 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
户籍证明的格式
2014/01/13 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
检讨书怎么写
2015/01/23 职场文书
小学教师求职信范文
2015/03/20 职场文书
公司表扬信格式
2015/05/04 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
什么是Python装饰器?如何定义和使用?
2022/04/11 Python