むい

HMW

DIGITAL SPACE

Lychee|缺失的 placeholder生成时出现Error

placeholder 是什么

图片还没完全加载出来之前显示的极小、模糊的占位图(类似Instagram大图加载前先看到一个模糊色块,然后逐渐清晰)。作用是提升用户体验——避免页面空白,加载更顺滑。
它不影响照片本身的正常显示,只是缺少这个”加载过渡效果”,没有的话用户看到的可能是直接空白或加载图标,等大图加载完才显示,不会”看不到照片”。

通过终端生成时出现大量Error

100%全部失败,从第0张就开始报错,这说明问题不是个别照片损坏,而是placeholder这个特定生成步骤本身的系统性问题,可能是用到了某种特殊格式转换被ImageMagick策略限制了。
placeholder生成方式跟small/medium不同:它通常会把图片转成极小尺寸+模糊处理,最终可能编码成WEBP或者直接做了data-URI编码,这中间可能调用了被限制的ImageMagick功能。
→ 检查policy.xml里是否有格式相关的限制:

cat /etc/ImageMagick-6/policy.xml | grep -i "rights\|pattern"

这条策略禁止ImageMagick读取以 @ 开头的路径(这是ImageMagick的一种”从文件读取参数列表”语法)。Lychee生成placeholder时,底层imagick扩展某些版本/某些处理方式会用类似 @filename 这种引用方式去读图,一旦命中这条策略,就会直接返回”无法读取0字节”——这跟100%Error现象吻合。
而 smallmedium 等其他尺寸之所以成功,是因为它们走的是不同的读取方式,没有触发这条策略。

<policy domain="path" rights="none" pattern="@*" />

解决方法:放开这条策略限制

最简单直接的方式是注释掉这条规则:

sudo sed -i 's|<policy domain="path" rights="none" pattern="@\*" />|<!-- <policy domain="path" rights="none" pattern="@*" /> -->|' /etc/ImageMagick-6/policy.xml

但是Xserver共享主机环境下,/etc/ 目录通常是只读没有sudo权限的,这条命令将会失败。

sudo -l 2>&1
ls -la /etc/ImageMagick-6/policy.xml
-bash: /usr/bin/sudo: 許可がありません

换个思路:改用GD而不是Imagick生成placeholder

Lychee支持两种图片处理后端:Imagick 和 GD。
直接通过数据库改这个配置项:

mysql -u hmw9118_ly -p hmw9118_lychee -e "UPDATE configs SET value=0 WHERE \`key\`='imagick';"

执行后确认修改成功:

mysql -u hmw9118_ly -p hmw9118_lychee -e "SELECT \`key\`, value FROM configs WHERE \`key\`='imagick';"

显示 value 为 0

Enter password: 
+---------+-------+
| key     | value |
+---------+-------+
| imagick | 0     |
+---------+-------+

修改成功。imagick已切换为关闭(改用GD)。现在清缓存并测试。

/usr/bin/php8.4 /home/hmw9118/houmengwei.com/public_html/photos/artisan config:clear
/usr/bin/php8.4 /home/hmw9118/houmengwei.com/public_html/photos/artisan cache:clear
/usr/bin/php8.4 -d max_execution_time=0 /home/hmw9118/houmengwei.com/public_html/photos/artisan lychee:generate_thumbs placeholder 1475 2>&1 | head -50

成功。全部变成 「created.
切换到GD后问题彻底解决。
确认是Imagick扩展(PHP Imagick + 系统ImageMagick库)在Xserver共享主机环境下处理某些操作时有兼容性问题,GD作为替代方案完美解决。

关于GD替代Imagick的影响说明

GD在某些高级处理上(比如RAW格式支持、部分滤镜效果)功能不如Imagick全面,但对于Lychee日常的缩略图生成、基础图片处理完全够用,画质和速度也不会有明显差异,可以放心使用。