Heroku推送PHP应用失败:执行cache:clear --no-warmup遇RuntimeException
解决Heroku部署PHP应用时
cache:clear --no-warmup触发的RuntimeException错误 从你贴的部署日志来看,核心错误是PHP Fatal error: Uncaught Error: Call to undefined function Doctrine\Common\Cache\apc_fetch(),这是典型的环境依赖不匹配问题,下面给你拆解原因和解决办法:
错误根源
- Heroku官方的PHP buildpack默认没有启用APC(或APCu)扩展——这个扩展是Doctrine
ApcCache驱动依赖的opcode缓存组件,而你的项目恰好配置了这个缓存驱动。 - 部署执行
cache:clear命令时,Doctrine尝试调用APC相关函数,但Heroku环境里找不到该函数,直接抛出致命错误导致部署失败。
可行的解决办法
1. 切换到Heroku原生支持的缓存驱动(最推荐)
把缓存驱动换成Heroku环境默认支持的类型,比如文件缓存、数组缓存(仅开发用),如果你的项目用到了Heroku Redis插件,也可以用Redis缓存。
以Symfony项目为例,修改生产环境配置文件app/config/config_prod.yml:
# Doctrine ORM缓存配置 doctrine: orm: metadata_cache_driver: type: file pool: doctrine.system_cache_pool query_cache_driver: type: file pool: doctrine.system_cache_pool result_cache_driver: type: file pool: doctrine.result_cache_pool # Symfony框架缓存组件配置(如果用到的话) framework: cache: app: cache.adapter.filesystem system: cache.adapter.filesystem
修改后提交代码,重新推送部署即可。
2. 在Heroku环境中安装APCu扩展(若必须用APC类缓存)
PHP7及以后版本,APC已经被APCu替代,你可以通过composer.json声明依赖来让Heroku自动安装:
- 在
composer.json的require区块添加:
"ext-apcu": "*"
- 同时确保Doctrine的缓存驱动配置为
ApcuCache(对应PHP7+的APCu扩展),而不是旧的ApcCache。 - 提交修改后的
composer.json和composer.lock,重新推送部署,Heroku会自动安装APCu扩展。
3. 临时修改部署时的缓存清理命令
如果不想改动核心配置,可以调整composer.json中的部署脚本,让缓存清理命令使用无依赖的数组驱动:
"scripts": { "post-install-cmd": [ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache --env=prod --no-warmup --cache-driver=array" ] }
这样部署阶段的缓存清理会绕过APC依赖,避免触发错误。
内容的提问来源于stack exchange,提问作者herokuplaya
相关产品推荐
相关产品推荐

