使用最佳实践

在本小节中,你将会看到如何配置Yii2,得到最好的性能,以及额外的创建响应式应用的原则。这些原则既是常用的也是Yii相关的。因此,我们将能使用这些原则,甚至不使用Yii2时也可以。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做…

  1. 更新你的PHP到最新的稳定版本。PHP的主发布版可能会带来非常大的性能提升。关掉调试模式,并设置为prod环境。这可以通过编辑web/index.php
  1. defined('YII_DEBUG') or define('YII_DEBUG', false);
  2. defined('YII_ENV') or define('YII_ENV', 'prod');

注意:在yii2-app-advanced应用框架中,你可以使用shell命令php init,以及选择生产环境,用于加载优化的index.php和配置文件。

  1. 激活cache组件:
  1. 'components' => [
  2. 'cache' => [
  3. 'class' => 'yii\caching\FileCache',
  4. ],
  5. ],

你可以使用任何缓存存储,不只是FileCache。此外,你可以注册多个缓存应用组件,并使用Yii::$app->cacheYii::$app->cache2来获取不同的数据类型:

  1. 'components' => [
  2. 'cache' => [
  3. 'class' => 'yii\caching\MemCache',
  4. 'useMemcached' => true,
  5. ],
  6. 'cache2' => [
  7. 'class' => 'yii\caching\FileCache',
  8. ],
  9. ],

这个框架默认在它自己的类中使用cache组件。

  1. db组件激活表schema缓存:
  1. return [
  2. // ...
  3. 'components' => [
  4. // ...
  5. 'cache' => [
  6. 'class' => 'yii\caching\FileCache',
  7. ],
  8. 'db' => [
  9. 'class' => 'yii\db\Connection',
  10. 'dsn' => 'mysql:host=localhost;dbname=mydatabase',
  11. 'username' => 'root',
  12. 'password' => '',
  13. 'enableSchemaCache' => true,
  14. // Optional. Default value is 3600 seconds
  15. 'schemaCacheDuration' => 3600,
  16. // Optional. Default value is 'cache'
  17. 'schemaCache' => 'cache',
  18. ],
  19. ],
  20. ];
  1. 使用纯数据,而不是ActiveRecord对象来列出元素的集合。
  1. $categoriesArray = Categories::find()->asArray()->all();
  1. foreach中使用each()而不是all()来获取大量的结果:
  1. foreach (Post::find()->each() as $post) {
  2. // ...
  3. }
  1. 因为Composer的autoloader被用于包含大部分的第三方类文件,你应该考虑通过如下命令优化它:
  1. composer dump-autoload -o

工作原理…

YII_DEBUG被设置为false时,Yii关闭了所有trace级别的日志,并使用较少的错误处理代码。此外,当你设置YII_ENVprod时,你的应用不会加载Yii和Debug面板模块。

设置schemaCachingDuration为一个以秒为单位的数字,允许Yii的ActiveRecord缓存数据的schema。对于生产环境,我们非常建议这样做,它会大幅提高ActiveRecord的性能。为了使它能功能,你需要正确的配置cache

  1. 'cache' => [
  2. 'class' => 'yii\cache\FileCache',
  3. ],

激活缓存对其它Yii组件也有正面的影响。例如,Yii路由或者urlManager从cache路由开始。

当然,你可以进入到一种情况,先前的设置对于显著的提升性能没有帮助。在大部分情况下,这意味着这个应用本身是一个瓶颈,你需要更多的硬件。

  • 服务端性能只是重点中的一部分:服务端性能只是所有能影响全局性能中的一个点。通过优化客户端,例如CSS、图像和Javascript文件,正确的缓存和减少HTTP请求的数量,可以有一个很好的可见的性能提升,即使是没有优化PHP代码。
  • 不使用Yii做事:有些事情如果不使用Yii可以很好的完成。例如,实时修改图像大小在一个独立的PHP脚本中进行会更快,可以避免额外的负载。
  • Active Record和Query Builder以及SQL对比:在对性能比较敏感的应用部分使用Query Builder和SQL。一般情况下,AR对于添加和编辑记录非常有用,因为它添加一个很方便的校验层,但当查询记录时并没有什么用。
  • 经常检查慢查询:如果开发者意外忘记给一个表格添加索引,当数据库经常被读取时,数据库就会成为性能瓶颈;反之亦然,如果添加太多的索引,而又要经常写数据。同样的事情会发生在选择不必要的数据以及不需要的JOINs。
  • 缓存或者保存重型过程的结果:如果你可以在每一个页面加载过程中避免运行一个重型过程,这最好了。例如,保存或者缓存解析的markdown文本,净化一次后(这是一个非常耗资源的过程),以后就是可以直接用于展示的HTML了。
  • 处理太多的过程:有时有太多的过程需要立即处理。它可以创建复杂的报告,或者只是简单的发送电子邮件(如果你的项目加载的很重)。在这种情况下,最好将它放入到队列中,然后使用cron或者其它指定的工具来处理。

参考

欲了解更多关于性能调优和缓存的信息,参考如下地址: