• 技术文章 >后端开发 >php教程

    PHP多线程之内部多线程实例分析,php多线程实例分析_PHP教程

    2016-07-13 10:04:24原创270

    PHP多线程之内部多线程实例分析,php多线程实例分析


    本文实例分析了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程序设计有所帮助。

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/965358.htmlTechArticlePHP多线程之内部多线程实例分析,php多线程实例分析 本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下: 复...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 多线程 单例模式
    上一篇:php基础学习笔记(3),php基础学习笔记_PHP教程 下一篇:PHP实现指定字段的多维数组排序函数分享,多维数组_PHP教程
    千万级数据并发解决方案

    相关文章推荐

    • 消息队列RabbitMQ入门与PHP实例详解• 一个下载地址防盗的判断 大牛进来看下!该如何解决 • 求教smarty清空缓存判断的设计技能 • 多个二维数组怎么整合到一个数组里 • 新手 cookie登陆有关问题
    1/1

    PHP中文网