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

图1

4、为了避免在执行了新的数据库迁移后,数据表结构有变更。模拟一下数据库迁移的实现手动更新表结构,添加字段:is_deleted,如图2

图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

图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

图4

8、再次分析触发更新的原理,应该在于键名:sa:cache:28c0caa7a3c3c0bfa2e9d21956903c9d,在清除给定连接组件的数据库表结构缓存后,其值发生了变化,之前与之后的值对比,如图5

图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

图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

图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

图8

12、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,在并发数为 105 的时候,请求是一直成功的。上升至 120 ,就开始失败了。因此,可以认为其实际的并发峰值为 105,如图9

图9

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

图10

永夜