[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 带来了项目管理容易度,但性能不乐观,适用功能型系统,可以有大量类库使用;
如果开发当今互联网应用,可以说直接废。
Refer:PHP_Composer的利弊