Yii2 性能优化 来源yii2官方文档

时间:2022-08-15 09:21:20
优化你的 PHP 环境
  • 使用最新稳定版本的 PHP 。 PHP 的主要版本可能带来显著的性能提升。
  • 启用字节码缓存 Opcache(PHP 5.5或更高版本) 或 APC (PHP 5.4或更早版本)。字节码缓存省去了每次解析和加载 PHP 脚本所带来的开销。
 
开启 Schema 缓存
Schema 缓存是一个特殊的缓存功能, 每当你使用活动记录时应该要开启这个缓存功能。如你所知, 活动记录能智能检测数据库对象的集合(例如列名、列类型、约束)而不需要手动地描述它们。 活动记录是通过执行额外的SQL查询来获得该信息。 通过启用 Schema 缓存,检索到的数据库对象的集合将被保存在缓存中并在将来的请求中重用。 要开启 Schema 缓存,需要配置一个 cache 应用组件来储存 Schema 信息, 并在 配置 中设置 yii\db\Connection::enableSchemaCache 为 true :
'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',
],
],
 
合并和压缩资源
一个Web页面可以包含很多CSS 和/或 JavaScript 文件,为减少HTTP 请求和这些下载文件的大小, 通常的方式是在页面中合并并压缩多个CSS/JavaScript 文件为一个或很少的几个文件, 并使用压缩后的文件而不是原始文件。
 
 
优化会话存储
默认会话数据被存储在文件中。 这是好的对处于发展项目或小型项目。 但是,当涉及要处理大量并发请求时, 最好使用其他的会话存储方式,比如数据库。 Yii 支持各种会话存储。 你可以通过在配置中配置 session 组件来使用这些存储.
'components' => [
'session'=> [
     'class'=>'yii\web\DbSession',
],
],

以上配置是使用数据库来存储会话数据。默认情况下, 它会使用 db 应用组件连接数据库并将会话数据存储在 session 表。 因此,你必须创建如下的 session 表,

CREATE TABLE session (

    id CHAR(40) NOT NULL PRIMARY KEY,

    expire INTEGER,

    data BLOB

)
你也可以通过使用缓存来存储会话数据 yii\web\CacheSession 。 理论上讲,你可以使用只要支持数据缓存。 但是请注意,某些缓存的存储当达到存储限制会清除缓存数据。出于这个原因,你应主要在不存在存储限制时才使用这些缓存存储。 如果你的服务器支持 Redis,强烈建议你通过使用 yii\redis\Session 来作为会话存储。
 
使用普通数组
尽管活动记录对象使用起来非常方便, 但当你需要从数据库中检索大量数据时它的效率不如使用普通的数组。 在这种情况下,你可以考虑在使用活动记录查询数据时调用 asArray() , 使检索到的数据被表示为数组而不是笨重的活动记录对象。
 
优化 Composer 自动加载
因为 Composer 自动加载用于加载大多数第三方类文件, 应考虑对其进行优化,通过执行以下命令:
composer dumpautoload -o
 
处理离线数据
当一个请求涉及到一些资源密集操作, 你应该想办法在无需用户等待他们完成脱机模式时来执行这些操作。
有两种方法可以离线数据处理:推和拉。
在拉中,只要有请求涉及到一些复杂的操作,你创建一个任务,并将其保存在永久存储,例如数据库。然后, 使用一个单独的进程(如 cron 作业)拉任务,并进行处理。 这种方法很容易实现,但它也有一些缺点。 例如,该任务过程中需要定期地从任务存储拉。如果拉频率太低,这些任务可以延迟处理; 但是如果频率过高,将引起的高开销。
在推中,你可以使用消息队列(如 RabbitMQ ,ActiveMQ , Amazon SQS 等)来管理任务。 每当一个新的任务放在队列中,它会启动或者通知任务处理过程去触发任务处理。