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快速url重写更新版[需php 5.30以上]
Apr 25 PHP
解析PHP无限级分类方法及代码
Jun 21 PHP
php生成excel列序号代码实例
Dec 24 PHP
php阻止页面后退的方法分享
Feb 17 PHP
PHP验证码生成原理和实现
Jan 24 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 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注入点构造代码
2008/06/14 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
js数组的操作详解
2013/03/27 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
python实现多人聊天室
2020/03/31 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
浅谈python 类方法/静态方法
2020/09/18 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
2014年学习雷锋活动总结
2014/03/01 职场文书
党性教育心得体会
2014/09/03 职场文书
公司备用金管理制度
2015/08/04 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
JavaScript函数柯里化
2021/11/07 Javascript