Yii框架官方指南系列52——专题:性能调整

Yii框架官方指南系列52——专题:性能调整

网络应用程序的性能受很多因素的影响。数据库存取,文件系统操作,网络带宽等都是潜在的影响因素。 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 查询更快, 但它会让 INSERTUPDATE 或 DELETE 查询更慢。

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

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

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

6. 最小化脚本文件

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

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

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

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

$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/tlkt/blog/210569

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109875.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月28日 下午7:00
下一篇 2021年8月28日 下午8:00


相关推荐

  • 股票购买拐点在哪里

    股票购买拐点在哪里 股票购买拐点在哪里   逢低买,当然最好买在拐点。股价始向上的时候。   不过当主力刚开始吸筹时,反复震荡难免,没准还来一个诱空,这时介入心情极坏,毫无成就感,白受折磨。所以第一步,总是等主力先吃饱喝足,他是老大,我是小弟。   等主力吃够了喝足了,他会拉上去一点,最理想的介入点,就是等他洗盘结束时。当股价开始下跌,不必介入,再等,待拐点出现介入。   拐点在哪里呢?黄金分割?神奇数

    2022年6月26日
    34
  • CPLD和FPGA的区别(2)

    CPLD和FPGA的区别(2)可编程逻辑器件主要包括FPGA和CPLD,FPGA是FieldProgrammableGateArray缩写,CPLD是ComplexPromrammableLogicDevice的缩写。   从可编程逻辑器件的发展历史上来讲,CPLD一般是指采用乘积相结构的基

    2022年5月5日
    41
  • 快速入门Win+R命令(附图)

    快速入门Win+R命令(附图)最近在学习 Linux 被命令行深深吸引了 陷入其中不能自拔 考虑到 Windows 上也有 cmd 命令行 但对新人来说不是很友好 这次我们就先讲一下 Win R 运行框里的快捷键 绝对能提高不少效率 什么是 Win R 防止有些小白看不懂 所以说明一些 使用 Windows R 快捷键就可以打开如下图的运行窗口 在里面输入命令可以方便快捷地打开很多东西 而且本文的所有操作都是在这个运行框里输入的 不要与 cm

    2026年3月17日
    2
  • python url转码_深入浅出URL转码

    python url转码_深入浅出URL转码一 问题 编码问题是 JAVA 初学者在 web 开发过程中经常会遇到问题 网上也有大量相关的文章介绍 但其中很多文章并没有对 URL 中使用了中文等非 ASCII 的字符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明 本文将详细介绍由于在 URL 中使用了中文等非 ASCII 的字符造成乱码的问题 1 在 URL 中中文字符通常出现在以下两个地方 1 QueryString 中的参数值 比如 http s

    2026年3月18日
    2
  • sed文本处理工具

    sed文本处理工具

    2022年3月13日
    28
  • Cursor使用教程:手把手教你用Cursor Rules统一Java+Vue项目代码风格,团队协作效率提升300%!

    Cursor使用教程:手把手教你用Cursor Rules统一Java+Vue项目代码风格,团队协作效率提升300%!

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号