没有不值得去解决的问题,也没有不值得去学习的技术!

Yii 2.0 的性能优化之开启 Schema 缓存

在开启 Schema 缓存后,查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,已经存在 Schema 缓存数据
1、在应用运行的环境为开发环境,即 YII_ENV 的值为 dev 时,关闭 Schema 缓存,编辑 environments/dev/common/config/main-local.php


        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=g-p-y-a-a-c',
            'username' => 'g-p-y-a-a-c',
            'password' => 'H9xQ0wnWTDEAbRk9',
            'tablePrefix' => 'ac_',
            'charset' => 'utf8mb4',
            'enableSchemaCache' => false,
            'schemaCacheDuration' => 3600,
            'schemaCache' => 'redisCache',
        ],


2、在应用运行的环境为生产环境,即 YII_ENV 的值为 prod 时,开启 Schema 缓存,编辑 environments/dev/common/config/main-local.php


        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=g-p-y-a-a-c',
            'username' => 'g-p-y-a-a-c',
            'password' => 'H9xQ0wnWTDEAbRk9',
            'tablePrefix' => 'ac_',
            'charset' => 'utf8mb4',
            'enableSchemaCache' => true,
            'schemaCacheDuration' => 3600,
            'schemaCache' => 'redisCache',
        ],


3、在开启 Schema 缓存后,查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,已经存在 Schema 缓存数据,如图1
在开启 Schema 缓存后,查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,已经存在 Schema 缓存数据
图1
4、为了避免在执行了新的数据库迁移后,数据表结构有变更。模拟一下数据库迁移的实现手动更新表结构,添加字段:is_deleted,如图2
为了避免在执行了新的数据库迁移后,数据表结构有变更。模拟一下数据库迁移的实现手动更新表结构,添加字段:is_deleted
图2
5、再次请求接口(与 user 表相关),查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,还未更新至缓存中 6、由于数据表结构有变更,进而导致 Schema 缓存数据 与 Schema 数据 的不一致,因此,需要清除给定连接组件的数据库表结构缓存。参考网址:https://www.yiiframework.com/doc/guide/2.0/zh-cn/caching-data ,执行控制台命令,但是查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,仍然还未更新至缓存中,如图3
由于数据表结构有变更,进而导致 Schema 缓存数据 与 Schema 数据 的不一致,因此,需要清除给定连接组件的数据库表结构缓存。参考网址:https://www.yiiframework.com/doc/guide/2.0/zh-cn/caching-data ,执行控制台命令,但是查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,仍然还未更新至缓存中
图3


PS E:\wwwroot\gitlab-php-yii2-app-advanced-cmc> ./yii cache/flush-schema db
Flush cache schema for "db" connection? (yes|no) [no]:yes
Schema cache for component "db", was flushed.



7、再次请求接口(与 user 表相关),查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,已经更新至缓存中,符合预期。由此得出结论,清除给定连接组件的数据库表结构缓存后,相应的缓存并未即时更新,而是在有使用到相应的表结构的时候,再触发更新(仅更新涉及到的相应表,未涉及到的表不会更新)。如图4
再次请求接口(与 user 表相关),查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,已经更新至缓存中,符合预期。由此得出结论,清除给定连接组件的数据库表结构缓存后,相应的缓存并未即时更新,而是在有使用到相应的表结构的时候,再触发更新(仅更新涉及到的相应表,未涉及到的表不会更新)。
图4
8、再次分析触发更新的原理,应该在于键名:sa:cache:28c0caa7a3c3c0bfa2e9d21956903c9d,在清除给定连接组件的数据库表结构缓存后,其值发生了变化,之前与之后的值对比,如图5
再次分析触发更新的原理,应该在于键名:sa:cache:28c0caa7a3c3c0bfa2e9d21956903c9d,在清除给定连接组件的数据库表结构缓存后,其值发生了变化,之前与之后的值对比
图5


a:2:{i:0;s:21:"0.25243100 1577424191";i:1;N;}

a:2:{i:0;s:21:"0.84367400 1577424375";i:1;N;}


9、在 Docker 部署时,在容器升级时,执行了数据库迁移命令后,再执行清除给定连接组件的数据库表结构缓存的命令。编辑 build/c_files/config/init/console_init.sh,如图6
在 Docker 部署时,在容器升级时,执行了数据库迁移命令后,再执行清除给定连接组件的数据库表结构缓存的命令。编辑 build/c_files/config/init/console_init.sh
图6


if [[ $PCS_API_CFG_MIGRATE == "true" ]]
then
    php /mcloud/www/pcs-api/yii migrate --migrationPath=@yii/log/migrations/ --interactive=0
    php /mcloud/www/pcs-api/yii migrate --interactive=0
    php /mcloud/www/pcs-api/yii cache/flush-schema db --interactive=0
elif [[ $PCS_API_CFG_MIGRATE == "false" ]]
then
    echo "running without db migrate"
else
    echo "please set environment variable PCS_API_CFG_MIGRATE true or false"
fi


10、基于 Rancher 升级容器时,在应用运行的环境为生产环境,即 YII_ENV 的值为 prod 时,查看升级日志,Schema cache for component “db”, was flushed.,如图7
基于 Rancher 升级容器时,在应用运行的环境为生产环境,即 YII_ENV 的值为 prod 时,查看升级日志,Schema cache for component "db", was flushed.
图7


2019/12/27 下午3:24:28PCS_API_CFG_ENV=prod
2019/12/27 下午3:24:28Yii Application Initialization Tool v1.0
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28  Start initialization ...
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28   generate console/config/main-local.php
2019/12/27 下午3:24:28   generate console/config/params-local.php
2019/12/27 下午3:24:28   generate common/config/main-local.php
2019/12/27 下午3:24:28   generate common/config/params-local.php
2019/12/27 下午3:24:28   generate yii
2019/12/27 下午3:24:28   generate api/web/index.php
2019/12/27 下午3:24:28   generate api/web/robots.txt
2019/12/27 下午3:24:28   generate api/config/main-local.php
2019/12/27 下午3:24:28   generate api/config/params-local.php
2019/12/27 下午3:24:28   generate frontend/web/index.php
2019/12/27 下午3:24:28   generate frontend/web/robots.txt
2019/12/27 下午3:24:28   generate frontend/config/main-local.php
2019/12/27 下午3:24:28   generate frontend/config/params-local.php
2019/12/27 下午3:24:28   generate rpc/web/index.php
2019/12/27 下午3:24:28   generate rpc/web/robots.txt
2019/12/27 下午3:24:28   generate rpc/config/main-local.php
2019/12/27 下午3:24:28   generate rpc/config/params-local.php
2019/12/27 下午3:24:28   generate backend/web/index.php
2019/12/27 下午3:24:28   generate backend/web/robots.txt
2019/12/27 下午3:24:28   generate backend/config/main-local.php
2019/12/27 下午3:24:28   generate backend/config/params-local.php
2019/12/27 下午3:24:28   generate cookie validation key in backend/config/main-local.php
2019/12/27 下午3:24:28   generate cookie validation key in frontend/config/main-local.php
2019/12/27 下午3:24:28   generate cookie validation key in api/config/main-local.php
2019/12/27 下午3:24:28      chmod 0777 backend/runtime
2019/12/27 下午3:24:28      chmod 0777 backend/web/assets
2019/12/27 下午3:24:28      chmod 0777 frontend/runtime
2019/12/27 下午3:24:28      chmod 0777 frontend/web/assets
2019/12/27 下午3:24:28      chmod 0777 api/runtime
2019/12/27 下午3:24:28      chmod 0777 api/web/assets
2019/12/27 下午3:24:28      chmod 0755 yii
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28  ... initialization completed.
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28PCS_API_CFG_MIGRATE=true
2019/12/27 下午3:24:28Yii Migration Tool (based on Yii v2.0.15.1)
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28No new migrations found. Your system is up-to-date.
2019/12/27 下午3:24:28Yii Migration Tool (based on Yii v2.0.15.1)
2019/12/27 下午3:24:28
2019/12/27 下午3:24:28No new migrations found. Your system is up-to-date.
2019/12/27 下午3:24:29Schema cache for component "db", was flushed.


11、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,并发(峰值/上限):120/150,如图8
同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,并发(峰值/上限):120/150
图8
12、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,在并发数为 105 的时候,请求是一直成功的。上升至 120 ,就开始失败了。因此,可以认为其实际的并发峰值为 105,如图9
同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,在并发数为 105 的时候,请求是一直成功的。上升至 120 ,就开始失败了。因此,可以认为其实际的并发峰值为 105
图9
13、同一个接口(查询),在开启 Schema 缓存后,其性能测试结果,在并发数为 90 的时候,请求是一直成功的。上升至 105 ,就开始失败了。因此,可以认为其实际的并发峰值为 90,性能优化效果不甚明显,甚至有所倒退,但是,决定先就这样了,不回退版本,如图10
同一个接口(查询),在开启 Schema 缓存后,其性能测试结果,在并发数为 90 的时候,请求是一直成功的。上升至 105 ,就开始失败了。因此,可以认为其实际的并发峰值为 90,性能优化效果不甚明显,甚至有所倒退,但是,决定先就这样了,不回退版本
图10

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理