Symfony 3.1执行cache:clear后图片404问题求助
我之前维护老Symfony项目时也碰到过类似的LiipImagine缓存坑,咱们一步步来拆解解决:
核心关键:原图片不存在,缓存图根本没法生成
首先得明确一个点:LiipImagine是基于原图片生成处理后的缓存图的,没有原文件的话,就算清空一万次缓存也没用。
你的请求URL /media/cache/resolve/avatar/uploads/product/5ab37697e4da2.jpg 对应的原图片路径应该是 web/uploads/product/5ab37697e4da2.jpg(因为你配置的resolvers是默认的web_path,Bundle会把resolve/后面的路径直接映射到web目录下的对应文件)。你说找不到原图片,这是当前最致命的问题——必须先找回这个原文件,或者确认它是不是存在其他目录里(比如app/uploads?)。
生产环境缓存清理的正确姿势
你之前清理的是dev环境缓存(/var/cache/dev),但生产环境的缓存是单独存放在/var/cache/prod的,确实需要清理生产环境的缓存,操作步骤和注意事项如下:
执行清理命令
在项目根目录运行:
# 推荐:清理生产环境缓存并预热,避免用户首次访问卡顿 php bin/console cache:clear --env=prod # 如果不需要预热,也可以用这个 php bin/console cache:clear --env=prod --no-warmup
操作注意事项
- 权限是老大难:一定要用和web服务器相同的用户(比如
www-data)执行命令,不然缓存目录或媒体缓存目录很容易出现权限拒绝的问题。可以用sudo -u www-data php bin/console ...切换用户执行。 - 选对时间:生产环境清理缓存会短暂影响应用性能,尽量在用户访问量低的时段操作。
- 别忘了OPcache:如果你的服务器开了OPcache,清理完Symfony缓存后最好重启PHP-FPM或者手动清一下OPcache,避免旧的缓存代码残留。
LiipImagine缓存图生成的排查点
如果原图片确实存在,但访问URL还是404,那得检查这几个地方:
- 路由配置:确认
app/config/routing.yml里已经引入了LiipImagine的路由:liip_imagine: resource: "@LiipImagineBundle/Resources/config/routing.xml" - Web服务器重写规则:检查
web/.htaccess(Apache)或者Nginx的配置,确保/media/cache/resolve/*的请求能正确转发到Symfony的入口文件app.php。 - 媒体缓存目录权限:
web/media/cache目录必须有写入权限,LiipImagine要把生成的缓存图写到这里。可以执行chmod -R 775 web/media/cache或者调整目录所属用户来解决权限问题。
解决prod.log无记录的问题
生产环境默认日志级别是error,LiipImagine的一些警告(比如原图片不存在)可能没被记录。你可以临时修改app/config/config_prod.yml的日志级别来获取更多信息:
monolog: handlers: main: level: debug # 其他配置保持不变
修改后清理生产环境缓存,重新访问图片URL,再查看var/logs/prod.log,应该能看到具体的错误提示(比如“原图片不存在”或者“无法写入缓存目录”)。
总结步骤
- 找回或确认原图片
web/uploads/product/5ab37697e4da2.jpg的存在性和正确路径; - 用正确的用户执行生产环境缓存清理命令;
- 检查
web/media/cache目录的写入权限; - 访问图片URL,测试是否自动生成缓存图;
- 若仍失败,临时开启debug日志排查具体错误。
内容的提问来源于stack exchange,提问作者Olivier

