在更换主机服务商,以及将博客搬家后,在上传图片时总是报一个错,不管是在编辑文档的页面,还是在多媒体管理页面。给出的信息是图片后处理失败,可能的原因是服务器忙,图片太大,或者是尺寸超标。然而诡异的是,当刷新页面的时候,这个图片是成功上传到服务器的,并且压缩更名等后处理步骤也已经完成。可是就是每次会有这么一个烦人的错误警示。而且很影响记录内容的连贯性,每次需要插入一张照片的时候,就需要刷新一下才能显示,那么我文章没写完,插入图片刷新就会把我没保存的文字给弄没,很是不方便。
在Chrome控制台显示的HTTP错误是这样:
1moxie.min.js:1 POST http://域名.com/blog/wp-admin/async-upload.php 520
我根据这个错误提示开始找原因,服务器忙首先排除。因为服务器是我自己的,忙不忙我清楚。另外这个问题也不是一换到这个主机商就出现了,而是用了一段时间才出现,所以这个方面不再考虑。第二是我的图片太大,这个是有可能,我服务器没有在这一条进行配置使用的是默认选项,最大照片不能超过2M,但是我最近上传的照片都是截图,体积很小,并且尝试了至少有几十张图片吧,大大小小不同格式都试过了,都是同样的错误。第三个原因也不可能了,尝试那么多图片,全部都没超过2500像素。
我谷歌查资料,这个问题出现的频率很低,查到的相关网页寥寥,很多都集中在三个可能原因的后两个,我尝试过改过像素限制,以及体积限制,都不能解决我的问题。stateOverflow基本上每个相关的帖子我都看过,每一个回答挨着尝试。wordpress官方论坛也有相关帖子,可惜在我这里统统失效。我前前后后查了有三次四想要把这个问题解决,每次都好打一会儿时间各种尝试,可是真是邪门儿了,上百个页面看过后就是没有一个奏效的方法,关键的关键是我最近并没有怎么捣鼓博客程序,也不是由于我自己搞坏的。
今天又一次忍不了了,劳动节假期宅在家也不能出门,下决心一定要把这个烦人的bug给解决掉。终于在这个页面找到了我遇到问题的真正原因
https://www.wpbeginner.com/wp-tutorials/how-to-fix-the-http-image-upload-error-in-wordpress/
这个页面介绍了4中解决上传图片时候出现HTTP错误的方法,第一第二讲的可能是网络原因,以及服务器限制文件大小的原因。这个在我这里已经排除了,因为我清楚我的服务器图片大小限制,以及几个月了一直有这个错误也不是网络的原因。文中第三条引起了我的注意,文中讲WordPress使用两种方法来处理图片,一个是PHP的GD库,另一个是Imagick库。Wordpress会选择一个服务器上安装了的库去使用。并且文中讲到Imagick总所周知不稳定,经常引起莫名其妙的HTTP错误。我受到启发想起来,我在博客搬家后前期没有遇到我这篇文章的bug,是后来遇到的。在使用服务器一段时间后,我通过wordpress官方健康度检测,当时我记得推荐我安装Imagick库,说可以提高wordpress性能。我当时确实就安装了。会不会就是这个库的原因,以至于后来wordpress开始使用Imagick处理图片,从而出现我遇到的这个bug。
于是我从服务器上将这个库卸载,然后重启Apache:
sudo apt remove php-imagick
sudo service apache2 restart
曙光终于出现了,困扰我半年的一个bug终于小时了,真的是这个库的原因。
上边那个教程第三点讲我们可以通过修改主题functions.php文件,从而指定wordpress使用GD库而不是Imagick。我相信这个应该也是可以解决问题的。文中第四点讲Imagick在使用服务器资源的时候可能出问题,尤其在共享主机上。Imagick会尝试使用多线程从而提升图片处理效率,而有些主机上限制多线程的使用,从而出现报错的情况。通过修改.htaccess让Imagick只是用1个线程而避免报错。这个可能就是我遇到的问题的根本原因了,我现在使用的是一家小运营商,很便宜资源很足,3.99欧每个月,4GB双核,300GB的HDD+SSD Boosting,流量还无限,并且机房离我住的地儿还近,就几十公里。稍微熟悉点主机市场的同学都知道,这个价格就像是骗钱的一样让人难以置信。不过确实他们说到的这些真的足量,用起来很香。但是在看不见的地方,可能他们为了节省成本,就限制的比较紧,我猜测我的问题应该就是他们对于多线程做了限制的原因。
我复盘这个怪异问题出现的原因,首先是我安装了Wordpress作为可选项的一个库Imagick,这个不安装完全不影响wordpress的使用。另外我使用了一家极为不知名的服务商,各个事情都是有代价的,可能在绝大多数知名主机商对这个并没有做出限制,而我恰巧遇上了。第三是我是使用新服务器过了一段时间才安装的Imagick,开始使用的是GD也没有错误提醒。并且Imagick也是Wordpress推荐的,导致我遇到问题时候压根没考虑过是服务器的限制,我把所有的经历都放在在Wordpress找错上了。
我最终的解决办法,并不是在wordpress指定使用GD库,或者修改服务器配置让Imagick只使用一个线程。我是直接讲Imagick在服务器上给卸载了。。。因为这个库是个提升性能锦上添花的,我想先看看没有这个库用一段时间什么感觉,在有必要的时候,我再选择安装。