部署PHP Yii框架网站到Heroku遇目录不存在错误的解决方法
解决Yii部署到Heroku时「The directory does not exist: /app/API/assets」错误
嘿,这个问题我之前帮人排查过,本质是Heroku的文件系统特性和Yii的assets目录机制不匹配导致的,给你几个靠谱的解决方案:
方案一:把assets目录加入Git仓库(最直接)
Heroku是从你的Git仓库拉取代码部署的,而Git默认不会跟踪空目录。所以如果本地项目里的API/assets是空的或者不存在,部署到Heroku后这个目录也不会出现,Yii尝试写入时就会报错。解决步骤:
- 本地创建
API/assets目录(如果还没的话):mkdir -p API/assets - 在目录里放一个占位文件
.gitkeep(Git会跟踪这个文件,从而保留目录):touch API/assets/.gitkeep - 把这个文件加入Git并提交:
git add API/assets/.gitkeep && git commit -m "Add assets directory with .gitkeep" - 推送到Heroku:
git push heroku main
方案二:修改Yii配置,将assets指向Heroku可写目录
Heroku的文件系统是临时的,但/tmp目录是允许写入的(每次dyno重启会清空,但Yii可以自动重新生成静态资源)。你可以调整Yii的assetManager配置,把assets目录转移到这里:
- 打开Yii的配置文件(比如
config/web.php或config/main.php) - 找到
assetManager配置块,修改basePath和baseUrl:
'assetManager' => [ 'basePath' => '/tmp/assets', 'baseUrl' => '/assets', // 前端访问路径保持不变,不影响用户体验 'linkAssets' => false, // 关闭文件链接,因为/tmp和web根目录不在同一位置,改用复制模式 ],
- 提交配置修改并推送到Heroku即可。
额外提醒
如果你的assets目录需要存储用户上传的内容,那Heroku的临时文件系统就不适合了,得改用云存储服务来存放这类持久化资源。
内容的提问来源于stack exchange,提问作者joshi yogesh
相关产品推荐
相关产品推荐

