在《MediaWiki无法显示Webp格式的图片》中已经碰到一次因为Webp格式图片导致的出错,但却没有完全解决。今天在typecho上更新文章的时候同样插入了一张Webp格式的图片,结果服务器卡死了。从系统监控中能看到,CPU性能飙到了100%(平时基本都在50%以下)。
一开始觉得可能是typecho的问题,网上说它不支持Webp。结果在设置中发现新版本开始支持该格式了。在重启服务器后,再次尝试上传Webp图片,这次倒是成功了,既能顺利保存修改的文章,刷新页面也能正常显示图片。
就当我以为问题解决之时,服务器再次卡死了。尝试将Webp图片转换成jpg格式后替换原有图片,服务器就一切顺利了。
估计是Webp搞的鬼,看来之前的问题不得不想办法解决了。
首先解决PHP的gd库问题,因为需要重装PHP,所以当时没处理。但是跟后面的imagick安装相比,这种程度的折腾还是太容易了。
因为用的是oneinstack一键安装脚本,那就继续沿用该方式。只不过在开始重装前需要对脚本进行修改。
打开include
子目录中的php-8.0.sh
(之前用PHP8.0还算稳定,所以暂时没有升级的意愿,毕竟MediaWiki官方也没建议用php8,多一事不如少一事),在--with-zlib
后面添加--with-webp
(有两处,见下图高亮处):
进入src
子目录,删除php8.0的文件和文件夹。之后通过uninstall.sh
选择Uninstall all PHP
进行删除,再用install.sh
交互安装,除PHP外全部选n,当然也可以直接用代码;
install.sh --php_option 10 --phpcache_option 1 --php_extensions imagick,fileinfo,redis,memcached
PHP的扩展根据个人需要自己决定。看看phpinfo的反馈:
GD库是支持了,imagick还是不支持。
尝试用上述类似的方法重装imagick扩展。同样找到include
子目录中的ImageMagick.sh
,在第一个./configure
的行最后加入--with-webp=yes
,修改变成:
./configure --prefix=${imagick_install_dir} --enable-shared --enable-static --with-webp=yes
删除src
子目录中的ImageMagick文件和文件夹。然后再次使用uninstall.sh(选择Uninstall PHP extensions->Uninstall imagick)卸载并通过./install.sh --php_extensions imagick
安装imagick。
结果根本没效果。
网上另外的方法就是通过手动编译安装ImageMagick,因为CentOS 7通过yum安装方式获得的版本太低,不支持Webp格式。那就先卸载系统中的,然后下载并解压新版的ImageMagick。
wget https://imagemagick.org/download/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz
接着就是配置和编译:
./configure --prefix=/usr
make
sudo make install
ldconfig
据说7.0之后的版本默认开启webp支持,所以不再需要--with-webp
参数。
安装很顺利,没有出现什么错误。通过convert-version
看看效果:
不是说默认开启webp的吗?为什么还是没有支持?那就带上参数试试,结果还是一样,没用。
在网上搜索了很久没有找到合理的解释和解决方案,无意中看到某篇文章提到配置结果:
为什么值是no?顺着这个线索找:
原来是libwebp的版本太低了,所以导致ImageMagick没法支持webp。
可是CentOS 7最高也就只支持到0.3.0-11,手工编译又不确定哪个版本正确(我尝试过一次,好像没啥用而且还把PHP给弄崩溃,无法启动了)。
当然,这些都是后话了。
既然libwebp无法用高版本,那就找个能支持低版本的ImageMagick呢?貌似网上给出的答案是6.9.12.8-1.el7版本已支持webp格式,因为依赖了libwebp7-devel(x86-64)包,不过需要使用remi源。
yum -y install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
接下去就是安装ImageMagick6了
yum --enablerepo=remi install ImageMagick6
无法安装,提示libwebp版本冲突:
Error: libwebp7-devel conflicts with libwebp-devel-0.3.0-11.el7.x86_64
就在找寻解决方案的时候,chatGPT给出的提示是让我先删除libwebp-devel-0.3.0-11.el7.x86_64,然后执行
yum install libwebp7
都到这份上就死马当活马医,姑且一试。
安装完毕,再次安装ImageMagick6也挺顺利。
注意:如果你之前手动安装过ImageMagick,一定记得make uninstall
一下,否则安装完毕还是以之前手动安装的为准。
到这里还算一切正常,直到我开始重新安装PHP的imagick扩展,竟然出现上面提到的127错误(error while loading shared libraries: libwebp.so.4
)。
最开始以为就是因为手动编译了libwebp,可就算我用快照回滚(这篇文章诞生于N次的快照回滚,最惨的就是我把PHP整崩溃了,然后点保存时520错误,白写了)回到libwebp的手动编译前,通过上述步骤一样会发生错误。
最终的解决办法就是卸载PHP再重装。
折腾两天之后,终于暂时告一段落!
参考资料
Oneinstack开启WebP图片支持的方法
oneinstack配置imagick的webp支持
PHP 安装 magick 模块,并开启 webp 格式支持
CentOS7安装ImageMagick和扩展包以支持webp和heic格式
2 条评论
这个php怎么安装imagick呢,pecl安装报错呢,我看说要先安装ImageMagick-devel,我这个安装也报错,哎
作为玩票性质的个人用户,我之所以喜欢用脚本一键安装就是因为每次手动安装太麻烦,排查工作太复杂