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
4、为了避免在执行了新的数据库迁移后,数据表结构有变更。模拟一下数据库迁移的实现手动更新表结构,添加字段: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
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
8、再次分析触发更新的原理,应该在于键名: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
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
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
12、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,在并发数为 105 的时候,请求是一直成功的。上升至 120 ,就开始失败了。因此,可以认为其实际的并发峰值为 105,如图9
13、同一个接口(查询),在开启 Schema 缓存后,其性能测试结果,在并发数为 90 的时候,请求是一直成功的。上升至 105 ,就开始失败了。因此,可以认为其实际的并发峰值为 90,性能优化效果不甚明显,甚至有所倒退,但是,决定先就这样了,不回退版本,如图10
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/250508.html