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

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

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

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

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

{
    "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>

时间: 2024-08-03 11:22:27

[PHP]Yaf + composer 引起大幅性能下降的相关文章

压力测试tps性能下降问题解决方案

压力测试tps性能下降问题解决方案 背景 测力测试时反映tps一直下滑的问题,为了重现该问题,开发一个简单交易进行测试,测试代码如下 录制该交易脚本,并放在LoadRunner11中进行测试,场景为10个用户同时启动并持续的跑.可以看到1分钟之后tps开始下降,并在后期持续下降. 此时分析服务端日志.javacore.heapdump.gc等,并未发现异常现象.修改服务端线程池相关等,但测试结果却是一如既往的下滑.记录服务端处理请求时间,发现一直很稳定,初步怀疑是客户端压力不够导致,但一直无具体

【翻译自mos文章】在win2003 sp1下,遇到无法解释的数据库性能下降

翻译自mos文章:在win2003 sp1下,遇到无法解释的数据库性能下降 Unexplained Database Slowdown Seen on Windows 2003 Service Pack 1 (Doc ID 464683.1) Applies to: Oracle Server - Enterprise Edition - Version 9.2.0.1 to 11.1.0.6 [Release 9.2 to 11.1] z*OBSOLETE: Microsoft Windows

关于反射会导致计算机的性能下降的讨论

在操作Java框架时,通过会用到反射技术,但是反射技术有一个缺点:会导致计算机的性能下降,因为反射占用了计算机的缓存.比如通过反射技术创建某一类的实例时,会先得到该类的构造函数,如果缓存中没有该构造函数,JVM就会创建一个构造函数,并将这个构造函数缓存起来,当下次再创建该构造函数的实例时,就不会去字节码文件中获得构造函数,而是直接通过缓存获得该构造函数,然后再创建实例对象.(可以参看Class类的中newInstance部分的源代码) 网上有这种说法,我觉得是不准确的,期待各位的指正: 反射会导

(转)一个MySQL 5.7 分区表性能下降的案例分析

一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓分区表使用中存在的陷阱,避免在该版本上继续踩坑.同时通过对源码的分享,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的运用. 问题描述 MySQL 5.7版本中,性能相关的改进非常多.包括临时表相关的性能改进,连接建立速度的优化和复制分发相关的性能改进

python+uwsgi导致redis无法长链接引起性能下降问题记录

今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因引起的. 没有办法的情况下,直接登录服务器,从uwsgi与nginx中卸载掉这个web服务,然后暴力的在命令操作符下输入python main.py,执行访问发现又正常了......狂吐血400CC...然后是各种怀疑uwsgi和nginx,查看配置与其他服务正常,排除完后只能回归到检查代码. 静下

redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合,后续的话,我就可以通过productid来查看该customerid是否买了此商品,如果购买了,就可以有相关的关联推荐,当然这只是系统中 的一个小业务条件,这时候我就可以用到SADD操作方法,代码如下: static void Main(string[] args) { ConnectionMult

Redis大幅性能提升之Batch批量读写

提示:本文针对的是StackExchange.Redis 一.问题呈现 前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange.Redis里面我确实没有找到PipeLine命令,找到的是Batch命令,因此对其用法进行了探究一下. 下面的代码是我之前写的: 1 public List<StudentEntity> Get(List<int> ids) 2 { 3 List<StudentEntity> result = new List&l

一条sql导致数据库整体性能下降的诊断和解决的全过程

今天早上一来,数据库load就比往常高了许多.想想数据库唯一的变化是昨天早上我曾经重新分析过数据库对象. [@[email protected]] 发现数据库load很高,首先看top发现没有特别异常的进程,在数据库中适时抓取正在运行的sql也没发现异常(通常运行时间非常短的sql是不能被抓取到的).询问相关应用程序人员,最近没有变动.检查应用程序日志发现今天早上跟往常也没有过多登陆和操作.基本上可以圈定是在数据库服务器本身上面. 但是这个时候我还没有办法确定到底是哪个应用的哪个查询的问题,因为

mysql重启服务后在高峰期导致性能下降的解决办法

注意,只有在正常关闭mysql服务的情况下,才会起作用,如果采用kill -9 mysqld这种方式,热数据不会导出