zoukankan      html  css  js  c++  java
  • [PHP]Yaf + composer 引起大幅性能下降

    composer.json 文件可以用命令 composer init 创建,命令是交互式的。

    也可以直接编辑一个 json 文件,如下:

    repositories 中 url 使用中国全量镜像地址.

    要引入依赖包,可以直接加进去,也可以用命令行,composer require "predis/predis:v1.1.1"

    加入 require-dev 就加上 --dev 选项.

    {
        "name": "farwish/yafapp",
        "type": "app",
        "description": "application",
        "license": "MIT",
        "authors": [
            {
                "name": "farwish",
                "email": "farwish(a)foxmail.com"
            }
        ],  
        "require": {
            "php": ">=5.4.0",
            "predis/predis": "v1.1.1"
        },  
        "repositories": {
            "packagist": {
                "type": "composer",
                "url": "https://packagist.phpcomposer.com"
            }
        }   
    }

    composer -v  查看所有选项和命令

    使用自动加载,只需在框架启动文件中加入 require "vendor/autoload.php"; 在 Yaf 中可以这样做:

    class Bootstrap extends Yaf_Bootstrap_Abstract{
    
        /** 
         * 注册composer
         */
        public function _initAutoload()
        {   
             require __DIR__ . "/../vendor/autoload.php";
        }
    
        ...
    }

    然后就可以直接使用类库了,非常方便。

    // 使用Predis库
    $client = new PredisClient();
    $client->set('foo', 'bar');
    echo $client->get('foo');

    不过使用 composer 自动加载和大类库会产生比较大的性能消耗;下面只使用内置api进行操作。

    // 使用扩展内置类
    $client = new Redis();
    $client->set('foo', 'bar');
    echo $client->get('foo');

    用ab进行简单压测:ab -c 100 -n 1000 http://localhost/yafapp/index.php/index/index 

    使用 redis 扩展内置api,qps 稳定 >1200.

    使用 composer 自动加载依赖类库,qps 会降至 800.

    使用 Predis 类库操作 redis,qps 则只有 250~300.

      

    composer 自动加载优化,可以把需要自动加载的类库放在 vender/composer/autoload_classmap.php 中,

    laravel 的 php artisan optimize 也相当于下面这条命令,映射文件以 "命名空间"=>"绝对地址" 的大数组返回,

    从测试结果来看,这个提升比例在个位数。

    $ composer dump-autoload --optimize
    <?php
    
    // autoload_classmap.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'Predis\Autoloader' => $vendorDir . '/predis/predis/src/Autoloader.php',
        'Predis\Client' => $vendorDir . '/predis/predis/src/Client.php',
        ...
    );

    下面的命令用来清除自动加载类库的键值映射。

    $ composer dump-autoload
    <?php
    
    // autoload_classmap.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
    );

    结论:composer 带来了项目管理容易度,但性能不乐观,适用功能型系统,可以有大量类库使用;

    如果开发当今互联网应用,可以说直接废。

    Link: http://www.cnblogs.com/farwish/p/5628192.html

  • 相关阅读:
    括号匹配性检测C语言实现
    预处理命令--宏定义
    *运算和&运算
    retain, copy, assign以及autorelease
    自定义 一个单例
    多米音乐笔试题
    UI-自定义视图、视图控制器
    Foundation框架—集合
    Foundation框架—字符串
    Foundation框架—结构体
  • 原文地址:https://www.cnblogs.com/farwish/p/5628192.html
Copyright © 2011-2022 走看看