[PHP]Yaf + composer 引起大幅性能下降

本文探讨了Composer作为PHP依赖管理工具在项目中的使用方式及其对性能的影响。通过对比不同加载方式下的性能表现,分析了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

@黑眼诗人  <www.farwish.com>

tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发服务器,同时支持同步阻塞,异步非阻塞回调,协程这 3 种 IO 模型。 主要特性: 基于 PHP,相比 C 开发更高效 基于 Swoole 扩展,强大的异步 IO 支持 PHP coroutine 支持服务器监控器和提供接口 要求: php5.5 Swoole1.7.18 linux,OS X 服务器配置: vim server.ini [server] ;server type:tcp,udp,http type = http ; port listen[] = 12312 ; entrance file root = '/data/web_deployment/serv/test/index.php' ;php start path php = '/usr/local/php/bin/php' [setting] ; worker process num worker_num = 16 ; task process num task_worker_num = 0 ; dispatch mode dispatch_mode = 2 ; daemonize daemonize = 1 ; system log log_file = '/data/log/test.log' 启动服务器: cd /root/tsf/bin/ php swoole testHttpServ start 使用 TCP/UDP/HTTP 客户端:   $tcpReturn=(yield $this->tcpTest());   $udpReturn=(yield $this->udpTest());   $httpReturn=(yield $this->httpTest());   public function tcpTest(){     $ip = '127.0.0.1';     $port = '9905';     $data = 'test';     $timeout = 0.5; //second     yield new Swoole\Client\TCP($ip, $port, $data, $timeout);   }   public function udpTest(){     $ip = '127.0.0.1';     $port = '9905';     $data = 'test';     $timeout = 0.5; //second     yield new Swoole\Client\UDP($ip, $port, $data, $timeout);   }   public function httpTest(){     $url='http://www.qq.com';     $httpRequest= new Swoole\Client\HTTP($url);     $data='testdata';     $header = array(       'Content-Length' => 12345,     );     yield $httpRequest->get($url); //yield $httpRequest->post($path, $data, $header);   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值