Yii2性能优化
https://www.yiiframework.com/doc/guide/2.0/zh-cn/tutorial-performance-tuning
性能优化
有许多因素影响你的 Web 应用程序的性能。有些是环境, 有些是你的代码,而其他一些与 Yii 本身有关。 在本节中,我们将列举这些因素并解释如何通过调整这些因素来提高应用程序的性能。
优化你的 PHP 环境
一个好的 PHP 环境是非常重要的。为了得到最大的性能,
- 使用最新稳定版本的 PHP。 PHP 的主要版本可能带来显著的性能提升。
- 启用字节码缓存 Opcache(PHP 5.5或更高版本) 或 APC (PHP 5.4或更早版本)。字节码缓存省去了每次解析和加载 PHP 脚本所带来的开销。
- Tune
realpath()cache.
禁用调试模式
对于运行在生产环境中的应用程序,你应该禁用调试模式。 Yii 中使用名为 YII_DEBUG 的常量来定义调试模式是否应被激活。 若启用了调试模式,Yii 将需要额外的时间来产生和记录调试信息。
你可以将下面的代码行放在 入口脚本 的开头来禁用调试模式:
defined('YII_DEBUG') or define('YII_DEBUG', false);
提示:
YII_DEBUG的默认值是 false 。所以如果你确信你不在你应用程序代码中别的地方更改其默认值, 你可以简单地删除上述行来禁用调试模式。
使用缓存技术
你可以使用各种缓存技术来提高应用程序的性能。例如,如果你的应用程序允许用户以 Markdown 格式输入文字, 你可以考虑缓存解析后的 Markdown 内容,避免每个请求都重复解析相同的 Markdown 文本。 请参阅 缓存 一节, 了解 Yii 提供的缓存支持。
开启 Schema 缓存
Schema 缓存是一个特殊的缓存功能, 每当你使用活动记录时应该要开启这个缓存功能。如你所知, 活动记录能智能检测数据库对象的集合(例如列名、列类型、约束)而不需要手动地描述它们。 活动记录是通过执行额外的 SQL 查询来获得该信息。 通过启用 Schema 缓存,检索到的数据库对象的集合将被保存在缓存中并在将来的请求中重用。
要开启 Schema 缓存,需要配置一个 cache 应用组件来储存 Schema 信息, 并在 配置 中设置 yii\db\Connection::$enableSchemaCache 为 true :
return [
// ...
'components' => [
// ...
'cache' => [
'class' => 'yii\caching\FileCache',
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=mydatabase',
'username' => 'root',
'password' => '',
'enableSchemaCache' => true,
// Duration of schema cache.
'schemaCacheDuration' => 3600,
// Name of the cache component used to store schema information
'schemaCache' => 'cache',
],
],
];
合并和压缩资源文件
一个复杂的网页往往包括许多 CSS 和 JavaScript 资源文件。 为减少 HTTP 请求的数量和这些资源总下载的大小,应考虑将它们合并成一个单一的文件并压缩。 这可大大提高页面加载时间,且减少了服务器负载。 想了解更多细节,请参阅前端资源部分。
优化会话存储
默认会话数据被存储在文件中。 这是好的对处于发展项目或小型项目。 但是,当涉及要处理大量并发请求时, 最好使用其他的会话存储方式,比如数据库。 Yii 支持各种会话存储。 你可以通过在配置中配置 session 组件来使用这些存储, 如下代码:
return [
// ...
'components' => [
'session' => [
'class' => 'yii\web\DbSession',
// Set the following if you want to use DB component other than
// default 'db'.
// 'db' => 'mydb',
// To override default session table, set the following
// 'sessionTable' => 'my_session',
],
],
];
以上配置是使用数据库来存储会话数据。默认情况下, 它会使用 db 应用组件连接数据库并将会话数据存储在 session 表。 因此,你必须创建如下的 session 表,
CREATE TABLE session (
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB
)
你也可以通过使用缓存来存储会话数据 yii\web\CacheSession 。 理论上讲,你可以使用只要支持数据缓存。 但是请注意,某些缓存的存储当达到存储限制会清除缓存数据。出于这个原因,你应主要在不存在存储限制时才使用这些缓存存储。 如果你的服务器支持 Redis,强烈建议你通过使用 yii\redis\Session 来作为会话存储。
如果您的服务器上有 Redis, 强烈建议您使用 yii\redis\Session 作为会话存储。
优化数据库
执行数据库查询并从数据库中取出数据往往是一个 Web 应用程序主要的性能瓶颈。 尽管使用数据缓存技术可以缓解性能下降,但它并不完全解决这个问题。 当数据库包含大量的数据且缓存数据是无效的, 获取最新的数据可能是最耗性能的假如在没有适当地设计数据库和查询条件。
一般来说,提高数据库查询的性能是创建索引。例如,如果你需要找一个用户表的“用户名”, 你应该为“用户名”创建一个索引。 注意,尽管索引可以使选择查询的速度快得多,但它会减慢插入、更新和删除的查询。
对于复杂的数据库查询,建议你创建数据库视图来保存查询分析和准备的时间。
最后,在“SELECT”中使用“LIMIT”查询。 这可以避免从数据库中取出大量数据。
使用普通数组
尽管活动记录对象使用起来非常方便, 但当你需要从数据库中检索大量数据时它的效率不如使用普通的数组。 在这种情况下,你可以考虑在使用活动记录查询数据时调用 asArray(), 使检索到的数据被表示为数组而不是笨重的活动记录对象。例如,
class PostController extends Controller
{
public function actionIndex()
{
$posts = Post::find()->limit(100)->asArray()->all();
return $this->render('index', ['posts' => $posts]);
}
}
在上述代码中,$posts 将被表中的行填充形成数组。每一行是一个普通的数组。要访问 第 i 行的 title 列,你可以使用表达式 $post[$i]['title']。
你也可以使用 DAO 以数组的方式来构建查询和检索数据。
优化 Composer 自动加载
因为 Composer 自动加载用于加载大多数第三方类文件, 应考虑对其进行优化,通过执行以下命令:
composer dumpautoload -o
另外,您可以考虑使用 authoritative class maps 和 APCu 缓存。 请注意,这两种选择可能适用于您的特定情况,也可能不适合您。
处理离线数据
当一个请求涉及到一些资源密集操作, 你应该想办法在无需用户等待他们完成脱机模式时来执行这些操作。
有两种方法可以离线数据处理:推和拉。
在拉中,只要有请求涉及到一些复杂的操作,你创建一个任务,并将其保存在永久存储,例如数据库。然后, 使用一个单独的进程(如 cron 作业)拉任务,并进行处理。 这种方法很容易实现,但它也有一些缺点。 例如,该任务过程中需要定期地从任务存储拉。如果拉频率太低,这些任务可以延迟处理; 但是如果频率过高,将引起的高开销。
在推中,你可以使用消息队列(如 RabbitMQ ,ActiveMQ , Amazon SQS 等)来管理任务。 每当一个新的任务放在队列中,它会启动或者通知任务处理过程去触发任务处理。
性能分析
你应该配置你的代码来找出性能缺陷,并相应地采取适当措施。 以下分析工具可能是有用的:
准备扩展应用程序
当没有任何帮助时,您可以尝试使您的应用程序可扩展。Configuring a Yii2 Application for an Autoscaling Stack 中提供了一个很好的介绍。有关进一步阅读,请参阅 Web apps performance and scaling.
Yii2性能优化的更多相关文章
- Yii2 性能优化 来源yii2官方文档
优化你的 PHP 环境 使用最新稳定版本的 PHP . PHP 的主要版本可能带来显著的性能提升. 启用字节码缓存 Opcache(PHP 5.5或更高版本) 或 APC (PHP 5.4或更早版本) ...
- 缓存技术之——Yii2性能优化之:缓存依赖
Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化.有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动是依赖的东西所导致的. 依赖可 ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- JavaScript性能优化
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...
- 02.SQLServer性能优化之---牛逼的OSQL----大数据导入
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...
随机推荐
- Python + Apache Kylin 让数据分析更加简单!
现如今,大数据.数据科学和机器学习不仅是技术圈的热门话题,也是当今社会的重要组成.数据就在每个人身边,同时每天正以惊人的速度快速增长,据福布斯报道:到 2025 年,每年将产生大约 175 个 Zet ...
- Tomcat 部署多个web项目
1.若Tomcat的端口设置为10000,则http://localhost:10000访问的目录是 webapps 2.Service.xml中host内配置Context标签,path+docba ...
- SDOI R2 咕咕记
Day 0 路上堵车,\(5\)点才到宾馆 \(BCT\)为什么在山上啊!!!! 试机的时候敲了一下多项式求逆的板子 回到宾馆订了\(KFC\)的外卖 Day 1 爬山的时候跟\(asuldb\)说 ...
- golang-笔记2
结构体: 是一种数据 类型. type Person struct { —— 类型定义 (地位等价于 int byte bool string ....) 通常放在全局位置. name string ...
- Hadoop 机架(集群拓扑)设置
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_rack_awareness Hadoop会通过集群 ...
- web 安全登录算法
摘自:http://hi.baidu.com/weiqi228/blog/item/922e961bbcc2c0188618bfb5.html 对于 Web 应用程序,安全登录是很重要的.但是目前大多 ...
- mac安装rust
1.安装 curl https://sh.rustup.rs -sSf | sh 使用brew各种出错,还慢. 2编译 source $HOME/.cargo/env 3.版本查看 rustc --v ...
- C平衡二叉树(AVL)创建和删除
AVL是最先发明的自平衡二叉查找树算法.在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n.查找.插入和删除在平均和最坏情况下 ...
- unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0
You will love this game kit! Have you ever wondered what it would be like to run your own farm? Look ...
- configure-nginx-how-to-handle-500-error-on-upstream-itself-while-nginx-handle 自定义header 传递header 定义拦截器
应用程序拦截 nginx 拦截 保证 接口返回 https://serverfault.com/questions/859667/configure-nginx-how-to-handle-500-e ...