[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 Predis\Client();
$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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM