「時々」っていうのがやっかいな案件です。私が遭遇したのはバルク(一括)で画像をアップロードしたときのこと。20枚程の画像をアップロードしていると、【アップロード中】→【処理中】→【完了】のように表示が変わり、次の画像のアップロードが始まる・・という流れなのですが、これが時々アップロード100%のまま次の画像のアップロード処理に入ってしまうんです。
実はこれ、以前に知り合いからなんだかおかしい・・と言われていたことでした。
時々処理が転ぶって??いやいやそんなことは・・・みたいに考えて放置していましたけど、今回は自身の目で確認。ちょっとびっくりしました。
今回はこんな感じで「時々」画像アップロード時に処理が途中でスキップされ、最終的にhttpエラーとなる現象について、原因と今の環境でできる対策を検証しつつ紹介します。
結論 サーバーのプラン見直しが最善の策!?
レンタルサーバーは当然のごとくサーバー用のコンピューターで動いています。
レンタルサーバーを選ぶ際に気にするのはサーバーの容量。〇〇GB(ギガバイト)という数字ばかりに目が行きがちですね。でもコンピュータなのですからご自身のパソコンと同じく
- どんなCPUが搭載されているのか?
- どの位のメモリが積まれているのか?
というのも気にするべき内容。しかしなかなか公開しているサーバーも少ないですからそこまで見分けるのは難しいですね。
私の場合、カラフルボックスサーバーなのであらかじめ公表されているのも確認して契約したのですが、今回のような転びが発生しました。
結論としてバルクアップロード時にメモリがいっぱいになり、CPUが困り始め・・・で時折転ぶという現象が発生するようです。エラーログやメモリ・CPUの履歴を見てもhttpエラーが出たところ辺りでレッドゾーンになってました(笑)。
まあ、プランが最低のものなので仕方ない言えば仕方ないですけど・・・解消するには上位プランにするしかないという結論に達しました。もしも同様の現象が他のサーバーでもあるようならログを見てみてくださいね。
そうはいっても何とかうまく・・・ということでここから本題の原因と対策を紹介します。
そもそもアップロードする画像が大きすぎる
我が家でも最近デジタル一眼レフなるカメラを購入し、我が家の猫の写真などをどんどん撮影してます。興味のある方はOrdinary Lifeをご覧くださいね。
デジタル一眼レフで撮影した画像のファイルサイズはパソコンへ転送した段階で4~6メガバイト位あるんです。さすがスマホの画像とは違ってビッグサイズ!!ですね。
これをそのままアップロードすると・・・PHPとWordPressの許容されるサイズであればアップロード自体はできます。でもここからサーバーが(WordPressが)行うのはサムネイルや大・中サイズなど複数の画像を生成します(これは後に表示を速くするために自動で生成されるものです)。
つまりビッグな画像からたくさんの画像を作っていくというプロセスがサーバーに負荷を与えて「もうできましぇーーん!」となったものが時々転ぶということになるようです。
この場合の対策としては
- 1枚ずつ処理完了を確認しながらアップロードする
- 画像サイズをあらかじめ縮小してからアップロードする
のいずれかになります。
画像圧縮プラグインがさらにサーバーを苦しめる!?
よく使われる画像圧縮系のプラグイン。ビッグな画像をアップロードしても勝手に圧縮してくれるからそのままでいいや!!で今までアップロードしてました。スマホなどで撮影したサイズの小さい画像の場合はそれでも良かったのですが、前述した一眼レフの画像となると・・・ということで、これも処理が遅延し、負荷がかかり・・・でエラーとなるようです。
画像圧縮プラグインの設定でアップロードと同時に圧縮する/しないという選択ができるものであれば、「しない」を選択することで処理プロセスが少なくなり、時々・・の頻度が下がりますから試してみてください。
そうでなければ画像アップロードの度にプラグインを停止して・・・なんてのは面倒なので圧縮する/しないが選択できるプラグインを紹介しておきます。
他サイズの画像生成処理を変更する
画像アップロード時のhttpエラーについては本当にたくさんのサイトで紹介されていてどれもコピペ?と思われるくらい同じ内容。そんな中で唯一あったのがWORDPRESSで画像アップロード時『HTTP エラー。』が出るというページでした。
このページでは原因やこの対策によってなぜ??という部分まで言及はされていませんでしたが、発生する原因については前述した通りかと思います。
で、このページに掲載されている
/*******************************************************************************
* switch image library
*******************************************************************************/
add_filter('wp_image_editors', 'switchImageLib');
function switchImageLib() {
return array('WP_Image_Editor_GD', 'WP_Image_Editor_Imagick');
}
というコードが何をしているのかというと、WordPress標準の画像処理機能であるGDをImagickでの処理に変えてちょーだい!という命令になります。
GDやImagickについての解説はご自身で調べていただくとして、なるほどこれは画期的かも知れないということで即導入させていただきました。サーバーでこの処理方法に対応していない場合には使用するとエラーが出るので、Imagickを導入するか、この変更をあきらめるかのいずれかになりますのでご注意を!!
掲載していただいたことに感謝します!!
私の場合ではありますが、最終的に
- 面倒&できない人がいるのでパソコンでの画像の圧縮はしない
- 画像アップロード時の同時圧縮処理を停止(プラグインの設定)
- 画像の生成をGDからImagickへ変更
で様子見することにしました。
これでだめならサーバーのプランを上位へ変更するか、1枚ずつアップロードするかしかないですね。
あんまりメモリやCPUのエラーで転ぶという状態が頻発すると共用サーバーでは負荷上昇により契約解除(泣)なんてことにもなりかねないので原因をしっかり調べて早めに対処されることをおすすめします。
全くの余談ですけど、画像投稿サイトなどのサービスはよっぽどすごい仕様のサーバーなんでしょうね、きっと。たくさんの人が同時にいろんなサイズの画像をアップロードするでしょうに・・・。
2019年11月25日追記
最近のWordPressバージョンでは、前述したImagikとGDの優先順位が、Imagik優先になっています。従ってhttpエラーが出るときは逆の措置をしなければなりません。
で、GDを優先にする方法を紹介していますので、解決しない場合にはお試しください。
※サーバーによってはImagikが使えないものもあり、その場合にはWordPressは自動でGDを利用するようになっています。もしもそうしたサーバーでエラーが出る場合には別の原因を疑う必要があります。