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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 把一个数据表导入另一个数据库_把一个表里的数据导入另一个表

    把一个数据表导入另一个数据库_把一个表里的数据导入另一个表文章作者:姜南(Slyar)文章来源:SlyarHome(www.slyar.com)转载请注明,谢谢合作。之前发了《表达式变量批量替换器batchSQL》这篇文章,有童鞋说导入数据用phpMyAdmin提供的csv导入功能不是更好。的确,导入数据进入mysql用这个功能非常好,不过如果需要进行批量操作的是update或者其他操作呢,例如要从新的excel里批量更新某一部分的数据,总不能全…

    2022年9月2日
    5
  • java线程池面试题有哪些?java线程池常见面试题「建议收藏」

    java线程池面试题有哪些?java线程池常见面试题「建议收藏」进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试题。1.了解过线程池的工作原理吗?当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了

    2022年5月26日
    38
  • pycharm选择运行环境_python编程入门

    pycharm选择运行环境_python编程入门本文实例讲述了pycharm中python环境配置常见问题。分享给大家供大家参考,具体如下:1、问题的发现最近在用pycharm下的命令行工具安装、运行jupyternotebook时kernal一直报错,报错最下面两行如下所示importwin32apiimporterror:dllloadfailed:找不到指定的模块。经过网络搜索发现是无法正确解析python的路径,可能是pyt…

    2022年8月28日
    6
  • matlab命令,应该很全了!「建议收藏」

    matlab命令,应该很全了!「建议收藏」一、常用对象操作:除了一般windows窗口的常用功能键外。1、!dir可以查看当前工作目录的文件。!dir&可以在dos状态下查看。2、who可以查看当前工作空间变量名,whos可以查看变量名细节。3、功能键:功能键快捷键说明方向上键Ctrl+P返回前一行输入方向下键Ctrl+N返回下一行输入方向左键Ctrl+B

    2022年9月28日
    2
  • Grid Search 网格搜索 介绍「建议收藏」

    Grid Search 网格搜索 介绍「建议收藏」什么是GridSearch网格搜索?网格搜素是一种常用的调参手段,是一种穷举方法。给定一系列超参,然后再所有超参组合中穷举遍历,从所有组合中选出最优的一组超参数,其实就是暴力方法在全部解中找最优解。为什么叫网格搜索,因为假设有两个超参,每个超参都有一组候选参数。这两组候选参数可以两两组合,把所有组合列出来就是一个二维的网格(多个超参两两组合可以看作是岗高维空间的网格),遍历网格中的所有节点,选出最优解。所以叫网格搜索。…

    2022年10月21日
    2
  • python进阶(4)文件操作[通俗易懂]

    python进阶(4)文件操作[通俗易懂]文件操作文件操作主要包括对文件内容的读写操作,这些操作是通过文件对象实现的,通过文件对象可以读写文本文件和二进制文件open(file,mode='r',buffering=-

    2022年7月28日
    8

发表回复

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

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