使用最佳实践

在本小节中,你将会看到如何配置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
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');

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

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

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

'components' => [
    'cache' => [
        'class' => 'yii\caching\MemCache',
        'useMemcached' => true,
    ],
    'cache2' => [
        'class' => 'yii\caching\FileCache',
    ],
],

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

  1. 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',
        ],
    ],
];
  1. 使用纯数据,而不是ActiveRecord对象来列出元素的集合。
$categoriesArray = Categories::find()->asArray()->all();
  1. foreach中使用each()而不是all()来获取大量的结果:
foreach (Post::find()->each() as $post) {
    // ...
}
  1. 因为Composer的autoloader被用于包含大部分的第三方类文件,你应该考虑通过如下命令优化它:
composer dump-autoload -o

工作原理...

YII_DEBUG被设置为false时,Yii关闭了所有trace级别的日志,并使用较少的错误处理代码。此外,当你设置YII_ENVprod时,你的应用不会加载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或者其它指定的工具来处理。

参考

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

results matching ""

    No results matching ""