当前位置: 首页 > news >正文

Yii性能调整

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

网络应用程序的性能受很多因素的影响。数据库存取,文件系统操作,网络带宽等都是潜在的影响因素。 Yii 已在各个方面减少框架带来的性能影响。但是在用户的应用中仍有很多地方可以被改善来提高性能。

1. 开启 APC 扩展

启用 PHP APC扩展 可能是改善一个应用整体性能的最简单方式。此扩展缓存和优化 PHP 中间代码并避免时间花费再为每个新来的请求解析PHP脚本。

2. 禁用调试模式

禁用调试模式是另一个改善性能的容易方式。若常量 YII_DEBUG 被定以为 true,这个 Yii 应用将以调试模式运行。调试模式在开发阶段是有用的,但是它影响性能因为一些组件引起额外的系统开销。例如,信息记录器(the message logger)将为被条被记录的信息记录额外的调试信息。

3. 使用 yiilite.php

当启用 PHP APC 扩展 时, 我们可以将 yii.php 替换为另一个名为 yiilite.php 的引导文件来进一步提高 Yii-powered 应用的性能。

文件 yiilite.php 包含在每个 Yii 发布中。它是一些常用到的 Yii 类文件的合并文件。在文件中,注释和跟踪语句都被去除。因此,使用 yiilite.php 将减少被引用的文件数量并避免执行跟踪语句。

注意,使用 yiilite.php 而不开启 APC 实际上将降低性能,因为 yiilite.php 包含了一些不是每个请求都必须的类,这将花费额外的解析时间。 同时也要注意,在一些服务器配置下使用 yiilite.php 将更慢,即使 APC 被打开。 最好使用演示中的 hello world 运行一个基准程序来决定是否使用 yiilite.php

4. 使用缓存技术

如在 缓存 章节所述,Yii 提供了几个可以有效提高性能的缓存方案。若一些数据的生成需要长时间,我们可以使用数据缓存 方法来减少数据产生的频率;若页面的一部分保持相对的固定,我们可以使用 碎片缓存 方法减少它的渲染频率;若一整个页面保持相对的固定,我们可以使用 页面缓存 方法来节省页面渲染所需的花销。

若应用在使用 Active Record,我们应当打开 数据结构缓存 以节省解析数据表结构的时间。可以通过设置 CDbConnection::schemaCachingDuration 属性为一个大于 0 的值来完成。

除了这些应用级别的缓存技术,我们也可使用服务级别的缓存方案来提高应用的性能。事实上,我们之前描述的 PHP APC 缓存 就属于此项。 也有其他的服务器技术,例如 Zend Optimizer, eAccelerator, Squid,其他不一一列出。

5. 数据库优化

从数据库取出数据经常是一个网络应用的主要瓶颈。虽然使用缓存可以减少性能损失,它不能解决根本问题。当数据库包含大量数据而被缓存的数据是无效时,如果没有良好的数据库和查询优化设计,获取最新的数据将会非常耗费资源。

在一个数据库中聪明的设计索引。索引可以让 SELECT 查询更快, 但它会让 INSERT, UPDATEDELETE 查询更慢。

对于复杂的查询,推荐为它创建一个数据库视图,而不是通过PHP代码生成查询语句让DBMS来重复解析他们。

不要滥用 Active Record。虽然 Active Record 擅长以一个 OOP样式模型化数据,它实际上为了它需要创建一个或几个对象来代表每条查询结果降低了性能。 对于数据密集的应用,在底层使用 DAO 或 数据库接口 将是一个更好的选择。

最后但并不是最不重要的一点,在你的 SELECT 查询中使用 LIMIT 。这将避免从数据库中取出过多的数据 并耗尽为 PHP 分配的内存。

6. 最小化脚本文件

复杂的页面经常需要引入很多外部的 JavaScript 和 CSS 文件。 因为每个文件将引起一次额外的往返一次,我们应当通过联合文件来最小化脚本文件的数量。我们也应当考虑减少每个脚本文件的大小来减少 网络传输时间。有很多工具来帮助改善这两方面。

对于一个 Yii 产生的页面,例外是一些由组件渲染的脚本文件我们不想要更改 (例如 Yii core 组件,第三方组件)。 为了最小化这些脚本文件,我们需要两个步骤。

Note: 下面描述的 scriptMap 特征已自版本 1.0.3 起被支持。

首先,通过配置应用组件 clientScriptscriptMap 属性来声明脚本被最小化。 可以在应用配置中完成,也可以在代码中配置。例如,

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>'/js/all.js',
'jquery.ajaxqueue.js'=>'/js/all.js',
'jquery.metadata.js'=>'/js/all.js',
......
);

上面的代码所做是映射这些 JavaScript 文件到 URL /js/all.js。 若这些 JavaScript 文件任何之一需要被一些组件引入, Yii 将引入这个 URL (一次) 而不是各个独立的脚本文件。

其次,我们需要使用一些工具来联合 (和压缩) JavaScript 文件为一个单独的文件,并保存为 js/all.js

相同的技巧也适用于 CSS 文件。

在 Google AJAX Libraries API 帮助下我们可以改善页面载入速度。例如,我们可以从 Google 的服务器引入 jquery.js而不是从我们自己的服务器。要这样做, 我们首先配置 scriptMap 如下,

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ajaxqueue.js'=>false,
'jquery.metadata.js'=>false,
......
);

通过映射(map)这些脚本文件为 false,我们阻止 Yii 产生引入这些文件的代码。作为替代,我们在页面中编写如下代码直接从 Google 引入文件,

<head>
<?php echo CGoogleApi::init(); ?>

<?php echo CHtml::script(
CGoogleApi::load('jquery','1.3.2') . "\n" .
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
CGoogleApi::load('jquery.metadata.js')
); ?>
......
</head>

转载于:https://my.oschina.net/chen08054/blog/61959

相关文章:

  • predict_proba 的使用
  • shell环境变量以及set,env,export的区别
  • 【PHP】富文本HTML过滤器:HTMLPurifier使用教程(防止XSS)
  • 让 webpack 加载 Source Map
  • 常见Oracle HINT的用法
  • vSphere虚拟化之外部存储部署(上)
  • C#枚举-避免不合理赋值
  • python3基础2--变量-字符编码-缩进-注释-用户输入-模块初识
  • 【强烈推荐】Kindle3下使用的提供加密功能的记事本,可以输入中文 -- KindleNote...
  • PTGAN:针对行人重识别的生成对抗网络 | PaperDaily #36
  • SqlParameter的作用与用法
  • vue官方推荐的环境
  • managedwifi.codeplex.com
  • 微信小程序之 Swiper(轮播图)
  • 方丈被害子女有没有权利继承遗产?
  • 【个人向】《HTTP图解》阅后小结
  • codis proxy处理流程
  • vue-router 实现分析
  • yii2权限控制rbac之rule详细讲解
  • 大整数乘法-表格法
  • 每天一个设计模式之命令模式
  • 前言-如何学习区块链
  • 如何合理的规划jvm性能调优
  • 使用权重正则化较少模型过拟合
  • 一个SAP顾问在美国的这些年
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #QT(串口助手-界面)
  • #大学#套接字
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Python) SOAP Web Service (HTTP POST)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (三)mysql_MYSQL(三)
  • (一)u-boot-nand.bin的下载
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)h264中avc和flv数据的解析
  • (转)Mysql的优化设置
  • *2 echo、printf、mkdir命令的应用
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Core 成都线下面基会拉开序幕
  • .Net Core 中间件验签
  • .NET Framework .NET Core与 .NET 的区别
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ?php echo ?,?php echo Hello world!;?
  • @GlobalLock注解作用与原理解析