Yii2.0.55和Yii3项目部署中最易出错的是测试与线上环境配置割裂:本地能跑的codeception.yml、test.php、db.php因路径错位、模块未显式启用、数据库host写死localhost,导致Yii::$app为null或Class not found。

Yii2.0.55和Yii3项目从本地到线上完整部署流程中最容易出错的是测试环境与线上环境的配置割裂——本地能跑通的codeception.yml、test.php、db.php在CI容器或生产服务器上因路径错位、模块未显式启用、数据库host写死localhost,直接导致Yii::$app为null或Class not found。
Codeception启动失败:Yii应用上下文缺失
第一步:确认codeception.yml中paths: tests:值为tests/(不是tests/unit/或tests/functional/),且该目录真实存在并含_unit.suite.yml文件。
第二步:Yii2.0.55项目必须在tests/unit.suite.yml中显式启用Yii2模块,并设置configFile: tests/_config/test.php;该test.php文件必须返回一个完整可运行的yii\web\Application实例,不能只是require入口脚本。
第三步:Yii3项目改用Yii3模块,configFile必须指向config/test/web.php这类DI容器可加载的纯配置数组,严禁沿用Yii2的test.php写法——否则容器无法解析,$app始终为空。
删掉tests/_bootstrap.php里所有手动require或include vendor/autoload.php的代码【Codeception的Yii2/Yii3模块已接管自动加载,重复引入会触发Cannot redeclare class】。
数据库连接在CI或线上随机失败
方法一:单元测试(unit)默认不连接数据库,functional/acceptance才启用Db模块。若在unit中调$I->seeRecord(),必然报Connection is not established——这不是Bug,是设计限制。
方法二:functional测试中启用Db模块后,必须在suite配置或_bootstrap.php中同时设populate: true和cleanup: true,否则每次运行残留旧数据,后续测试断言失败。
方法三:CI环境数据库host必须写服务名(如db),绝不能写localhost——Docker网络下localhost指向容器自身而非数据库容器,连接超时是唯一结果。
Nginx子目录部署时URL生成全错
config/web.php中必须同步设置两项:
'baseUrl' => '/myapp'(开头带/,结尾不带)
'scriptUrl' => '/myapp/index.php'
缺一不可。漏掉baseUrl,Url::to(['site/login'])生成/site/login;漏掉scriptUrl,开启enablePrettyUrl后重写规则找不到入口,全部404。
Nginx location块必须用带前缀的精确匹配:
location /myapp/ { alias /var/www/html/myapp/web/; … }
alias末尾【必须有/】,SCRIPT_FILENAME必须用$request_filename,否则PHP找不到index.php。
宝塔面板500错误的根源定位
站点根目录必须设为/web子目录(如/www/wwwroot/myapp/web),不是项目根目录。
检查web/index.php是否存在且权限为644,PHP版本选7.4+(Yii2.0.55要求PHP≥7.1,但实际建议7.4起)。
日志里出现require(): Failed opening required '/www/wwwroot/myapp/requirements.php',说明入口文件加载了错误相对路径——根源就是根目录设高了一级。
Docker容器启动后白屏或403
RUN docker-php-ext-install pdo_mysql mbstring xml ctype json后,必须紧接着RUN docker-php-ext-enable pdo_mysql mbstring xml ctype json——某些PHP镜像安装后不自动启用扩展。
Apache配置DocumentRoot必须指向/var/www/html/web(Yii2)或/var/www/html/public(Yii3),不能指向项目根目录。


















