ci4项目不能直接zip部署,必须清理writable目录、重置.env为production、确保public为web根目录、预执行composer install --no-dev --optimize-autoloader并校验autoload.php。

CI4 项目不能像 CI3 那样直接 zip 整个目录扔到服务器上就跑——打包前不清理、不重置环境、不预编译,上线后大概率 Class 'CodeIgniter\CodeIgniter' not found 或路由全 404。
打包前必须清掉 development-only 文件和缓存
CI4 的 writable/ 目录里混着开发期生成的缓存、日志、session、甚至 SQLite 数据库文件,直接打包会把本地路径、调试开关、临时密钥一起发到生产环境。
- 删掉
writable/cache/、writable/logs/、writable/session/全部内容(保留目录结构) - 清空
writable/debugbar/(如果装了 DebugBar) - 检查
writable/database.db(如果用 SQLite)——生产环境通常不用它,要么删掉,要么替换成空库并设好权限 - 运行
php spark cache:clear和php spark debugbar:clear(如果已安装)
.env 必须重置为 production 状态
打包时若漏改 .env,上线后仍处于 development 模式:错误堆栈暴露绝对路径、CSRF token 失效、日志写满磁盘、甚至数据库密码明文出现在响应头里。
- 确认
CI_ENVIRONMENT = production(不是prod或空值) - 注释或删掉所有
display_errors = 1、log_threshold = 4这类开发配置 -
app.baseURL必须设成真实域名,比如app.baseURL = "https://myapp.com/",不能是http://localhost:8080 - 数据库密码、JWT 密钥等敏感项不能留默认值或示例值;如果用环境变量注入(如 Docker),可留空但确保部署流程能覆盖
Apache/Nginx 部署时 public/ 必须是 Web 根目录
很多打包脚本习惯把整个项目 zip 后解压到 /var/www/html/myapp/,结果访问 https://myapp.com/ 报 404——因为 CI4 的入口是 public/index.php,不是项目根目录下的 index.php。
- Apache:虚拟主机的
DocumentRoot必须指向/path/to/myproject/public,不是项目根目录 - Nginx:
root指令必须设为/path/to/myproject/public,且需配try_files $uri $uri/ /index.php?$query_string; - 别把
app/、system/、writable/放在 Web 可访问路径下;它们必须在public/外层,且writable/对 Web 用户(如www-data)可写 - 确认
public/.htaccess文件存在且没被压缩工具过滤(有些 ZIP 工具默认忽略点开头文件)
vendor 目录不能靠 Composer install 补救
线上服务器没装 Composer?或者想最小化部署体积?别指望上传源码后在服务器上再跑 composer install——CI4 的自动加载、服务提供者注册、CLI 命令都强依赖 vendor/autoload.php 的完整结构,缺一个包或 autoloader 错位,php spark migrate 就直接报 Failed opening required 'vendor/autoload.php'。
- 打包前务必在本地执行完
composer install --no-dev --optimize-autoloader - 检查
vendor/autoload.php是否存在、是否可读,且vendor/composer/autoload_classmap.php不为空 - 如果用了自定义命名空间或第三方包,确认它们已写入
composer.json并被 autoload 正确映射 - 避免用
composer dump-autoload -o单独优化——它不重建 classmap,可能漏类;必须走完整install流程
最常被跳过的其实是 writable/ 权限校验和 baseURL 的硬编码——哪怕 .env 里写对了,public/index.php 里如果还残留 define('APPPATH', __DIR__ . '/../app/'); 这类相对路径逻辑,换环境就挂。CI4 的“可移植性”只在规范操作下成立,不是 zip 解压即用。











