使用最佳实践
在本小节中,你将会看到如何配置Yii2,得到最好的性能,以及额外的创建响应式应用的原则。这些原则既是常用的也是Yii相关的。因此,我们将能使用这些原则,甚至不使用Yii2时也可以。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic
应用。
如何做…
- 更新你的PHP到最新的稳定版本。PHP的主发布版可能会带来非常大的性能提升。关掉调试模式,并设置为
prod
环境。这可以通过编辑web/index.php
:
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');
注意:在yii2-app-advanced
应用框架中,你可以使用shell命令php init
,以及选择生产环境,用于加载优化的index.php
和配置文件。
- 激活
cache
组件:
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
你可以使用任何缓存存储,不只是FileCache
。此外,你可以注册多个缓存应用组件,并使用Yii::$app->cache
和Yii::$app->cache2
来获取不同的数据类型:
'components' => [
'cache' => [
'class' => 'yii\caching\MemCache',
'useMemcached' => true,
],
'cache2' => [
'class' => 'yii\caching\FileCache',
],
],
这个框架默认在它自己的类中使用cache
组件。
- 为
db
组件激活表schema缓存:
return [
// ...
'components' => [
// ...
'cache' => [
'class' => 'yii\caching\FileCache',
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=mydatabase',
'username' => 'root',
'password' => '',
'enableSchemaCache' => true,
// Optional. Default value is 3600 seconds
'schemaCacheDuration' => 3600,
// Optional. Default value is 'cache'
'schemaCache' => 'cache',
],
],
];
- 使用纯数据,而不是ActiveRecord对象来列出元素的集合。
$categoriesArray = Categories::find()->asArray()->all();
- 在
foreach
中使用each()
而不是all()
来获取大量的结果:
foreach (Post::find()->each() as $post) {
// ...
}
- 因为Composer的autoloader被用于包含大部分的第三方类文件,你应该考虑通过如下命令优化它:
composer dump-autoload -o
工作原理…
当YII_DEBUG
被设置为false
时,Yii关闭了所有trace级别的日志,并使用较少的错误处理代码。此外,当你设置YII_ENV
为prod
时,你的应用不会加载Yii和Debug面板模块。
设置schemaCachingDuration
为一个以秒为单位的数字,允许Yii的ActiveRecord缓存数据的schema。对于生产环境,我们非常建议这样做,它会大幅提高ActiveRecord的性能。为了使它能功能,你需要正确的配置cache
:
'cache' => [
'class' => 'yii\cache\FileCache',
],
激活缓存对其它Yii组件也有正面的影响。例如,Yii路由或者urlManager从cache路由开始。
当然,你可以进入到一种情况,先前的设置对于显著的提升性能没有帮助。在大部分情况下,这意味着这个应用本身是一个瓶颈,你需要更多的硬件。
- 服务端性能只是重点中的一部分:服务端性能只是所有能影响全局性能中的一个点。通过优化客户端,例如CSS、图像和Javascript文件,正确的缓存和减少HTTP请求的数量,可以有一个很好的可见的性能提升,即使是没有优化PHP代码。
- 不使用Yii做事:有些事情如果不使用Yii可以很好的完成。例如,实时修改图像大小在一个独立的PHP脚本中进行会更快,可以避免额外的负载。
- Active Record和Query Builder以及SQL对比:在对性能比较敏感的应用部分使用Query Builder和SQL。一般情况下,AR对于添加和编辑记录非常有用,因为它添加一个很方便的校验层,但当查询记录时并没有什么用。
- 经常检查慢查询:如果开发者意外忘记给一个表格添加索引,当数据库经常被读取时,数据库就会成为性能瓶颈;反之亦然,如果添加太多的索引,而又要经常写数据。同样的事情会发生在选择不必要的数据以及不需要的JOINs。
- 缓存或者保存重型过程的结果:如果你可以在每一个页面加载过程中避免运行一个重型过程,这最好了。例如,保存或者缓存解析的markdown文本,净化一次后(这是一个非常耗资源的过程),以后就是可以直接用于展示的HTML了。
- 处理太多的过程:有时有太多的过程需要立即处理。它可以创建复杂的报告,或者只是简单的发送电子邮件(如果你的项目加载的很重)。在这种情况下,最好将它放入到队列中,然后使用cron或者其它指定的工具来处理。
参考
欲了解更多关于性能调优和缓存的信息,参考如下地址: