Google App Engine标准环境部署Codeigniter4提示/tmp/cache无写入权限如何解决
1. 补充子目录自动创建逻辑
你已经修改了app/Config/Paths.php中的$writableDirectory为/tmp/,但CodeIgniter 4默认需要在可写目录下使用cache、logs、session等子目录,Google App Engine的/tmp目录虽然可写,但框架默认的目录创建逻辑可能在运行时没有触发成功。
注意:请确保你修改的是
app/Config/Paths.php而非system/Config目录下的同名文件,system目录下的文件会在composer更新时被覆盖,修改不生效。
你可以在项目入口文件public/index.php的最开头加入以下代码,提前创建所需的子目录并设置正确权限:
<?php $requiredDirs = [ '/tmp/cache', '/tmp/logs', '/tmp/session', '/tmp/uploads' ]; foreach ($requiredDirs as $dir) { if (!file_exists($dir)) { mkdir($dir, 0755, true); } } // 原有index.php的代码放在本段之后
2. 检查缓存配置避免硬编码
打开app/Config/Cache.php,确认$file参数的path配置没有写死原有writable/cache路径,正确配置应该是使用框架自动生成的WRITEPATH常量:
public $file = [ 'path' => WRITEPATH . 'cache', 'mode' => 0644, ];
WRITEPATH常量会自动读取你在Paths.php中配置的$writableDirectory值,不需要手动替换为固定路径。
3. 修正app.yaml入口点配置
你当前的app.yaml中注释掉了entrypoint,Google App Engine PHP7/8运行时默认会从项目根目录查找index.php,而CodeIgniter 4的入口文件在public目录下,需要显式指定entrypoint避免路径解析错误:
runtime: php74 entrypoint: serve public/index.php
4. 修正composer配置
你当前使用的composer.json是CodeIgniter4框架本身的配置,不是项目级配置,会导致依赖加载异常。建议使用官方项目模板的composer.json,或者部署前先执行composer dump-autoload重新生成自动加载文件。
5. 可选优化
如果开启了debug模式,框架会额外频繁校验缓存目录的可写性,你可以在.env文件中设置CI_ENVIRONMENT = production关闭debug模式,减少不必要的校验逻辑。另外Google App Engine的/tmp是实例级临时存储,实例重启后数据会清空,如果需要持久化缓存可以改用Redis、Memcache等内存存储方案。
内容的提问来源于stack exchange,提问作者Fian Julio

