ci4项目打包前必须清空writable/目录并重置.env:需删除cache、logs、session内容(保留结构),运行spark命令清理缓存,校验.env权限与production环境配置,确保public为web根目录且预执行composer install --no-dev。

CI4 项目打包前必须清空 writable/ 下的缓存与日志
直接 zip 整个目录上传,writable/cache/ 和 writable/logs/ 里混着本地调试生成的类映射、视图编译文件、错误堆栈,上线后轻则路由 404,重则 Class 'CodeIgniter\CodeIgniter' not found。这些不是“可选清理”,是硬性前置动作。
- 删掉
writable/cache/、writable/logs/、writable/session/全部内容(保留目录结构) - 运行
php spark cache:clear和php spark debugbar:clear(如果装了 DebugBar) - 检查
writable/database.db:生产环境不用 SQLite 就直接删;要用就替换成空库并设好权限(如chmod 644)
.env 文件必须重命名、重置、重校验
CI4 启动时只读一次 .env,名字错、权限错、值错,全都会静默失败。常见现象是数据库连不上、CSRF token 失效、日志写不进文件——但控制台不报错,排查起来特别绕。
- 确认文件名是
.env(不是.env.example或env),且 PHP 进程用户有读权限(上传后属主常变成root,需chown www-data:www-data .env) -
CI_ENVIRONMENT必须是production(不是prod、PROD或空值) -
app.baseURL填真实域名,如https://myapp.com/;不能留http://localhost:8080/ - 敏感项如
database.default.password、app.key不得为默认值或示例字符串
Apache/Nginx 必须把 public/ 设为 Web 根目录
CI4 的入口是 public/index.php,不是项目根目录下的 index.php。很多一键脚本解压完就跑,结果访问域名全是 404——根本没进框架,连 autoloader 都没加载。
- Apache:
DocumentRoot指向/path/to/myproject/public,不是项目根目录 - Nginx:
root指令设为/path/to/myproject/public,并配try_files $uri $uri/ /index.php?$query_string; - 确认
public/.htaccess存在且没被 ZIP 工具过滤(点开头文件常被忽略) -
app/、system/、writable/必须在public/外层,且不可通过 URL 直接访问
自动检测脚本要验证 PHP 扩展和 CLI 环境
CI4 强制依赖 mbstring、curl、json、xml,缺一个就卡在 autoload 阶段。更隐蔽的是:部署机上 php -v 显示 8.2,但 Apache 用的是系统默认的 7.2 ——脚本得分开检测。
- 用
extension_loaded('mbstring')检查扩展,别只看phpinfo() - CLI 和 Web SAPI 的
php.ini路径可能不同,脚本里应分别执行php -r "echo php_ini_loaded_file();"和php -r "echo php_sapi_name();" -
composer install --no-dev --optimize-autoloader必须在打包前预执行,否则线上vendor/autoload.php缺服务提供者注册逻辑 - 别信
php -m | grep mbstring——模块存在 ≠ 已启用,得实际调用函数验证
writable/ 目录的权限继承和 .env 的读取时机:前者导致日志写失败却无提示,后者让所有配置修改都白做。自动化脚本里这两步必须放在最前面,且带明确失败退出。











