yii migrate – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Sun, 31 May 2026 03:54:00 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 在 Yii2 中执行数据库迁移时报错:Exception ‘yii\di\NotInstantiableException’ with message ‘Failed to instantiate component or class “m220810_154914_create_table_access_tokens”.’ https://www.shuijingwanwq.com/2025/07/04/9189/ https://www.shuijingwanwq.com/2025/07/04/9189/#respond Fri, 04 Jul 2025 03:36:08 +0000 https://www.shuijingwanwq.com/?p=9189 浏览量: 91

1、在 Yii2 中执行数据库迁移时报错:Exception ‘yii\di\NotInstantiableException’ with message ‘Failed to instantiate component or class “m220810_154914_create_table_access_tokens”.’。如图1

在 Yii2 中执行数据库迁移时报错:Exception 'yii\di\NotInstantiableException' with message 'Failed to instantiate component or class "m220810_154914_create_table_access_tokens".'

图1


PS C:\wwwroot\object\src> ./yii migrate
Yii Migration Tool (based on Yii v2.0.49.4)

Total 1 new migration to be applied:
        m220810_154914_create_table_access_tokens

Apply the above migration? (yes|no) [no]:yes
*** applying m220810_154914_create_table_access_tokens
Exception 'yii\di\NotInstantiableException' with message 'Failed to instantiate component or class "m220810_154914_create_table_access_tokens".'

in C:\wwwroot\object\src\vendor\yiisoft\yii2\di\Container.php:509

Caused by: Exception 'ReflectionException' with message 'Class m220810_154914_create_table_access_tokens does not exist'

in C:\wwwroot\object\src\vendor\yiisoft\yii2\di\Container.php:507

Stack trace:
#0 C:\wwwroot\object\src\vendor\yiisoft\yii2\di\Container.php(507): ReflectionClass->__construct('m220810_154914_...')
#1 C:\wwwroot\object\src\vendor\yiisoft\yii2\di\Container.php(385): yii\di\Container->getDependencies('m220810_154914_...')
#2 C:\wwwroot\object\src\vendor\yiisoft\yii2\di\Container.php(170): yii\di\Container->build('m220810_154914_...', Array, Array)
#3 C:\wwwroot\object\src\vendor\yiisoft\yii2\BaseYii.php(365): yii\di\Container->get('m220810_154914_...', Array, Array)
#4 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\controllers\MigrateController.php(202): yii\BaseYii::createObject(Array)
#5 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\controllers\BaseMigrateController.php(757): yii\console\controllers\MigrateController->createMigration('m220810_154914_...')
#6 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\controllers\BaseMigrateController.php(216): yii\console\controllers\BaseMigrateController->migrateUp('m220810_154914_...')
#7 [internal function]: yii\console\controllers\BaseMigrateController->actionUp(0)
#8 C:\wwwroot\object\src\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
#9 C:\wwwroot\object\src\vendor\yiisoft\yii2\base\Controller.php(178): yii\base\InlineAction->runWithParams(Array)
#10 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\Controller.php(180): yii\base\Controller->runAction('', Array)
#11 C:\wwwroot\object\src\vendor\yiisoft\yii2\base\Module.php(552): yii\console\Controller->runAction('', Array)
#12 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\Application.php(180): yii\base\Module->runAction('migrate', Array)
#13 C:\wwwroot\object\src\vendor\yiisoft\yii2\console\Application.php(147): yii\console\Application->runAction('migrate', Array)
#14 C:\wwwroot\object\src\vendor\yiisoft\yii2\base\Application.php(384): yii\console\Application->handleRequest(Object(yii\console\Request))
#15 C:\wwwroot\object\src\yii(23): yii\base\Application->run()
#16 {main}


2、这个迁移文件是从别的项目中复制过来的。文件内容如下


createTable('access_tokens', [
            'id' => $this->string(20),
            'user_id' => $this->string(20),
            'access_token' => $this->string(200)->unique(),
            'ip' => $this->string(128)->defaultValue(''),

            'created_at' => $this->dateTime(),
            'updated_at' => $this->dateTime(),
        ], 'row_format=DYNAMIC');
        $this->addPrimaryKey('pk-id', 'access_tokens', 'id');
        $this->createIndex('idx-uid', 'access_tokens', 'user_id');

    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {
        echo "m220810_154914_create_table_access_tokens cannot be reverted.\n";

        return false;
    }

    /*
    // Use up()/down() to run migration code without a transaction.
    public function up()
    {

    }

    public function down()
    {
        echo "m220810_154914_create_table_access_tokens cannot be reverted.\n";

        return false;
    }
    */
}



3、暂时没有找到具体的原因,决定新建一个迁移文件,然后复制文件中的迁移实现。执行命令:./yii migrate/create create_access_tokens_table。执行迁移,未报错。后续才找到原因,删除掉 namespace console\migrations; 后就可以正常执行迁移。


PS C:\wwwroot\object\src> ./yii migrate/create create_access_tokens_table
Yii Migration Tool (based on Yii v2.0.49.4)

Create new migration 'C:\wwwroot\object\src\console/migrations\m250515_031604_create_access_tokens_table.php'? (yes|no) [no]:yes
New migration created successfully.
PS C:\wwwroot\object\src> ./yii migrate
Yii Migration Tool (based on Yii v2.0.49.4)

Total 1 new migration to be applied:
        m250515_031604_create_access_tokens_table

Apply the above migration? (yes|no) [no]:yes
*** applying m250515_031604_create_access_tokens_table
    > create table access_tokens ... done (time: 0.028s)
    > add primary key pk-id on access_tokens (id) ... done (time: 0.044s)
    > create index idx-uid on access_tokens (user_id) ... done (time: 0.038s)
*** applied m250515_031604_create_access_tokens_table (time: 0.122s)


1 migration was applied.

Migrated up successfully.


]]>
https://www.shuijingwanwq.com/2025/07/04/9189/feed/ 0
将 /vendor 加入至 Git 仓库后,Docker 部署,升级失败的分析解决 https://www.shuijingwanwq.com/2020/05/11/4130/ https://www.shuijingwanwq.com/2020/05/11/4130/#respond Mon, 11 May 2020 12:03:38 +0000 https://www.shuijingwanwq.com/?p=4130 浏览量: 215

1、编辑 .gitignore,将 /vendor 加入至 Git 仓库,如图1

编辑 .gitignore,将 /vendor 加入至 Git 仓库

图1


# composer vendor dir
# /vendor


2、在 Jenkins 中构建失败,查看 Console Output。如图2

在 Jenkins 中构建失败,查看 Console Output

图2


[0mThe command '/bin/sh -c chown -R nginx:nginx /mcloud/www/ &&     rm -rf /etc/nginx/conf.d/status.conf &&     chmod +x /usr/local/bin/composer &&     composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ &&     cd /mcloud/www/pcs-api &&     composer install' returned a non-zero code: 1
Build step 'Docker Build and Publish' marked build as failure
Finished: FAILURE


3、Docker 部署,删除 composer install。编辑 Dockerfile。如图3

Docker 部署,删除 composer install。编辑 Dockerfile。

图3


RUN chown -R nginx:nginx /mcloud/www/ && \
    rm -rf /etc/nginx/conf.d/status.conf && \
    chmod +x /usr/local/bin/composer && \
    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ && \
    cd /mcloud/www/pcs-api && \
    composer install



RUN chown -R nginx:nginx /mcloud/www/ && \
    rm -rf /etc/nginx/conf.d/status.conf


4、在 Jenkins 中构建成功。如图4

在 Jenkins 中构建成功。

图4

5、在 Rancher 中启动失败,查看日志。如图5

在 Rancher 中启动失败,查看日志。

图5


2020/5/8 下午2:48:45
2020/5/8 下午2:48:45  ... initialization completed.
2020/5/8 下午2:48:45
2020/5/8 下午2:48:45 PCS_API_CFG_MIGRATE=true


6、编辑 build/c_files/config/init/console_init.sh。删除 $PCS_API_CFG_MIGRATE == “true” 的相关命令。如图6

编辑 build/c_files/config/init/console_init.sh。删除 $PCS_API_CFG_MIGRATE == "true" 的相关命令。

图6

7、在 Rancher 中启动成功,查看日志。如图7

在 Rancher 中启动成功,查看日志。

图7


2020/5/8 下午2:48:45
2020/5/8 下午2:48:45  ... initialization completed.
2020/5/8 下午2:48:45
2020/5/8 下午2:48:45 PCS_API_CFG_MIGRATE=true


8、进入容器,手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。未成功运行,因为无相应输出。如图8

进入容器,手动执行 $PCS_API_CFG_MIGRATE == "true" 的相关命令。未成功运行,因为无相应输出。

图8

9、进入将 /vendor 加入至 Git 仓库前的容器。手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。成功运行,因为有相应输出。如图9

进入将 /vendor 加入至 Git 仓库前的容器。手动执行 $PCS_API_CFG_MIGRATE == "true" 的相关命令。成功运行,因为有相应输出。

图9

10、在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。未成功运行,报错。如图10

在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == "true" 的相关命令。未成功运行,报错。

图10


PS E:\wwwroot\pcs-api-develop> ./yii migrate --migrationPath=@yii/log/migrations/ --interactive=0
PHP Warning:  require(E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/src/Codeception/function.php): fa
iled to open stream: No such file or directory in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php on line 6
6

Warning: require(E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/src/Codeception/function.php): failed
to open stream: No such file or directory in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php on line 66
PHP Fatal error:  require(): Failed opening required 'E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/s
rc/Codeception/function.php' (include_path='.;C:\php\pear') in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.
php on line 66

Fatal error: require(): Failed opening required 'E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/src/Co
deception/function.php' (include_path='.;C:\php\pear') in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php o
n line 66


11、文件 E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/src/Codeception/function.php 不存在,如图11

文件 E:\wwwroot\pcs-api-develop\vendor\composer/../codeception/verify/src/Codeception/function.php 不存在

图11

12、进入将 /vendor 加入至 Git 仓库前的容器。文件 \vendor\composer/../codeception/verify/src/Codeception/function.php 存在。如图12

进入将 /vendor 加入至 Git 仓库前的容器。文件 \vendor\composer/../codeception/verify/src/Codeception/function.php 存在。

图12

13、查看 E:\wwwroot\pcs-api\vendor\codeception\verify,其目录下存在相应的文件。且 Git 显示是已经提交至仓库。如图13

查看 E:\wwwroot\pcs-api\vendor\codeception\verify,其目录下存在相应的文件。且 Git 显示是已经提交至仓库。

图13

14、进入将 /vendor 加入至 Git 仓库前的本地环境。发现 \vendor\codeception\verify 已经存在于 Git 中。只不过是 master 分支。如图14

进入将 /vendor 加入至 Git 仓库前的本地环境。发现 \vendor\codeception\verify 已经存在于 Git 中。只不过是 master 分支。

图14

15、最终决定切换至 master 分支,合并 develop 分支的代码。再推送至远程的 master 分支。在远程仓库中文件:\vendor\composer/../codeception/verify/src/Codeception/function.php 仍然不存在。如图15

最终决定切换至 master 分支,合并 develop 分支的代码。再推送至远程的 master 分支。在远程仓库中文件:\vendor\composer/../codeception/verify/src/Codeception/function.php 仍然不存在。

图15

16、删除目录:E:\wwwroot\pcs-api\vendor\codeception\verify\.git,将未显示已经提交至仓库的文件,添加至仓库。如图16、17

删除目录:E:\wwwroot\pcs-api\vendor\codeception\verify\.git,将未显示已经提交至仓库的文件,添加至仓库。

图16

 

删除目录:E:\wwwroot\pcs-api\vendor\codeception\verify\.git,将未显示已经提交至仓库的文件,添加至仓库。

图17

17、在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。未成功运行,报错,但是 /codeception/verify 相应的错误已经得到解决。参考步骤 16 同样处理。后续在运行命令的过程中报错的类似问题,皆可以如此处理。


PS E:\wwwroot\pcs-api-develop> ./yii migrate --migrationPath=@yii/log/migrations/ --interactive=0
PHP Warning:  require(E:\wwwroot\pcs-api-develop\vendor\composer/../myclabs/deep-copy/src/DeepCopy/deep_copy.php): faile
d to open stream: No such file or directory in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php on line 66

Warning: require(E:\wwwroot\pcs-api-develop\vendor\composer/../myclabs/deep-copy/src/DeepCopy/deep_copy.php): failed to
open stream: No such file or directory in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php on line 66
PHP Fatal error:  require(): Failed opening required 'E:\wwwroot\pcs-api-develop\vendor\composer/../myclabs/deep-copy/sr
c/DeepCopy/deep_copy.php' (include_path='.;C:\php\pear') in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php
 on line 66

Fatal error: require(): Failed opening required 'E:\wwwroot\pcs-api-develop\vendor\composer/../myclabs/deep-copy/src/Dee
pCopy/deep_copy.php' (include_path='.;C:\php\pear') in E:\wwwroot\pcs-api-develop\vendor\composer\autoload_real.php on l
ine 66


18、在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。成功运行。如图18

在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == "true" 的相关命令。成功运行。

图18

19、进入将 /vendor 加入至 Git 仓库前的本地环境。执行命令:composer install。成功运行。如图19

进入将 /vendor 加入至 Git 仓库前的本地环境。执行命令:composer install。成功运行。

图19


PS E:\wwwroot\pcs-api-feature-plan-tonglian> composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files


20、在本地环境中全新部署,执行命令:composer install。未成功运行。如图20

在本地环境中全新部署,执行命令:composer install。未成功运行。

图20


PS E:\wwwroot\pcs-api-develop> composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files


  [RuntimeException]
  Could not scan for classes inside "E:\wwwroot\pcs-api-develop\vendor/sebastian/object-enumerator/src/" which does n
  ot appear to be a file nor a folder


install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--n
o-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative]
 [--apcu-autoloader] [--ignore-platform-reqs] [--] []...



21、实际上,第 16、17 步骤,可以通过执行命令:composer require codeception/verify myclabs/deep-copy 来解决,而无需一定要将这 2 个包提交至 Git 仓库中。不过,即使采用此方案,仍然会存在第 20 步骤中所存在的问题。而且还会改变 /vendor/composer 中的其他文件。此方案不太可取。如图21

实际上,第 16、17 步骤,可以通过执行命令:composer require codeception/verify myclabs/deep-copy 来解决,而无需一定要将这 2 个包提交至 Git 仓库中。不过,即使采用此方案,仍然会存在第 20 步骤中所存在的问题。而且还会改变 /vendor/composer 中的其他文件。此方案不太可取。

图21

22、最终决定,先删除掉 /vendor ,提交至 Git 仓库,执行命令:composer install –no-dev。–no-dev:跳过 require-dev 字段中列出的包。再将 /vendor 提交至 Git 仓库。因为,已经确定,–dev:安装 require-dev 字段中列出的包 ( 这是一个默认值 )。提交至 Git 仓库仅能够提交空目录。如图22

最终决定,先删除掉 /vendor ,提交至 Git 仓库,执行命令:composer install --no-dev。--no-dev:跳过 require-dev 字段中列出的包。再将 /vendor 提交至 Git 仓库。因为,已经确定,--dev:安装 require-dev 字段中列出的包 ( 这是一个默认值 )。提交至 Git 仓库仅能够提交空目录。

图22

23、执行命令:composer install。安装 require-dev 字段中列出的包。再将 /vendor 提交至 Git 仓库。如图23

执行命令:composer install。安装 require-dev 字段中列出的包。再将 /vendor 提交至 Git 仓库。

图23

24、在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == “true” 的相关命令。成功运行。不符合预期。如图24

在本地环境中全新部署,手动执行 $PCS_API_CFG_MIGRATE == "true" 的相关命令。成功运行。不符合预期。

图24

25、查看全新部署的文件,目录:\codeception\verify、\vendor\myclabs\deep-copy 皆存在。如图25

查看全新部署的文件,目录:\codeception\verify、\vendor\myclabs\deep-copy 皆存在。

图25

26、在 /vendor 目录中搜索:.git,不存在相应的目录。而之前执行命令:composer install。未成功运行。在 /vendor 目录中搜索:.git,存在相应的目录。如图26

在 /vendor 目录中搜索:.git,不存在相应的目录。而之前执行命令:composer install。未成功运行。在 /vendor 目录中搜索:.git,存在相应的目录。

图26

27、编辑 build/c_files/config/init/console_init.sh。恢复 $PCS_API_CFG_MIGRATE == “true” 的相关命令。在 Rancher 中启动成功,查看日志。如图27

编辑 build/c_files/config/init/console_init.sh。恢复 $PCS_API_CFG_MIGRATE == "true" 的相关命令。在 Rancher 中启动成功,查看日志。

图27

28、在另一个产品中,在 /vendor 目录中搜索:.git,存在相应的目录。如图28

在另一个产品中,在 /vendor 目录中搜索:.git,存在相应的目录。

图28

29、在 Rancher 中启动失败,查看日志。如图29

在 Rancher 中启动失败,查看日志。

图29


2020/5/9 下午7:01:07 PHP Fatal Error 'yii\base\ErrorException' with message 'Class 'wartron\yii2uuid\behaviors\UUIDBehavior' not found'
2020/5/9 下午7:01:07
2020/5/9 下午7:01:07 in /mcloud/www/channel-pub-api/common/behaviors/UUIDBehavior.php:7
2020/5/9 下午7:01:07
2020/5/9 下午7:01:07 Stack trace:
2020/5/9 下午7:01:07 #0 [internal function]: yii\base\ErrorHandler->handleFatalError()
2020/5/9 下午7:01:07 #1 {main}


30、由于仅有一个目录:.git,决定采用第 16、17 步骤的方案。在 Rancher 中启动成功,查看日志。如图30

由于仅有一个目录:.git,决定采用第 16、17 步骤的方案。在 Rancher 中启动成功,查看日志。

图30

31、在 Jenkins 中构建时间的前后对比,分别为:13分钟、43秒。如图31

在 Jenkins 中构建时间的前后对比,分别为:13分钟、43秒。

图31

]]>
https://www.shuijingwanwq.com/2020/05/11/4130/feed/ 0