WordPressに写真のアップロードが出来たりできなかったりする場合の対処法
レンタルサーバー・エックスサーバーでWordPress
私は、以前Wordpress.comでこのブログを運営していましたが、11月にエックスサーバーへデータ毎移行しました。
移行したときにWordPressをインストールする際に使っていたのが、エックスサーバーの「WordPress簡単インストール」という機能です。
データ移行やドメインの移行は結構苦労しましたので、その時の話題はブログにアップしていますので、どうぞご参照ください。
さて、エックスサーバーに移行してから、数カ月経つのですが、写真のアップロードが上手く行かない場合が多かったです。
ようやく解決にこぎ着けたようなので、本日はその解決策を説明したいと思います。
写真のアップロードが失敗する、その症状は?
ブログで使う写真をアップロードするには、いくつか方法があります。
私の場合、スマホなどからGoogle フォトに置くようにしていました。以前は、JetPackプラグインを使って、Google フォトから写真を引っ張ってきたりしていたのですが、それもうまく動きません。JetPackのギャラリーでGoogle フォトの写真を選んで持ってくると、「ぐるぐる」アイコンが出てずっとそのまま止まってしまうようです。
仕方がないので、パソコンに写真を取り込み、WordPressの管理画面上の「メディア」へ写真のアップロードをするようにしました。でも、この方法も上手くいかない場合が多いのです。
症状としては、いわゆる「HTTPエラー」の表示が出ます。
エラー表示が出たのでアップロードできていないかと言うと、実はできていることもあります。エラー表示でもオリジナルの写真ファイルのアップロード自体は出来ています。その場合、ブログの記事には貼り付け可能。でも、サムネールや小さい画角の写真のファイルが生成されていないようなのです。
つまり、時と場合により、以下のような症状になります。
- ページを投稿した後、リンクをシェアしたときにサムネールが表示されない
- JetPackのウィジェット「人気の投稿とページ」に出てくるサムネール表示されずレイアウトが壊れる
- WordPress管理画面の「メディア」で一覧の表示をするとサムネールが表示されない
要は、オリジナルのファイルはアップロード出来ているものの、各所で使われる小さめの画像が正しく表示されないという状況です。
メディアライブラリのサムネールの状態
以下の図は、WordPressの管理画面>メディアで表示される「メディアライブラリ」の状態です。
サムネールがまるで表示されないので、困ります。クリックして詳細画面を出しても写真が表示されません。しかし、記事に取り込むと正しく表示されます。サイズが小さい画像ならば上手く行っているようです。
各サイズのサムネールが正しくできていないのかと思い、SSHでファイルが保存されているWordPressのインストールされているフォルダを見てみます。
例えば、public_html/wp-content/uploads/2019/01/というディレクトリを見ると、2019年1月にアップロードしたファイルを確認することができます。lsでみると、以下のように実際のファイルは存在します。
サクラ-1024×576.jpg
サクラ-1160×653.jpg
サクラ-150×150.jpg
サクラ-300×169.jpg
サクラ-768×432.jpg
何か処理が途中で終わって、データベースが壊れてしまっているのでしょうか。。。
ちなみに、プラグインJetPackのメディアライブラリを使うと、辛うじてサムネールが確認できるので、ダメな場合はこちらを使用していました。
アップロードできない場合の対策
以下の記事を参考にさせていただきました。
実は、それ上記にも、別のサイトで得た情報を元にphp.iniの値を変更しています。でも、最終的には、このmax_execution_timeを変更したことが一番効果がありました。
私の場合、max_execution_timeの値を180に変更しました。
念の為、私のphp.iniのデフォルトからの変更点を以下に記して置きます。
パラメータ | デフォルト値 | 変更後の値 |
max_execution_time | 30 | 180 |
memory_limit | 200M | 1000M |
upload_max_filesize | 30M | 2000M |
この設定で、今のところ、アップロードできない症状は解決しているようです。
考察
参考まで、PHPの日本語マニュアルによると、max_execution_timeの単位は「秒」です。
このパラメータの値の説明は、以下のようにあります。
スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。
推測すると、サーバで実行するWordPressのアップロードの処理が、max_execution_timeまで実行されて、途中で打ち切られます。その為、データベースに必要な情報が書かれずにサムネールのURLが正しく設定されていない、とかそんな話ではないでしょうか。
しかし、今までエラーになっていたケースはとても30秒も待たされている感じはありませんでした。一方で、この時間を伸ばすと解決します。
なんとも、気持ちが悪いですが、とりあえず様子見したいと思います。
上記のマニュアルには、以下のような説明もあります。
Web サーバー側でもタイムアウトの設定項目を持ち、 その設定で PHP の実行が中断されることもあります。 Apache には Timeout ディレクティブ、IIS には CGI タイムアウト関数があり、どちらもデフォルトで 300 秒に設定されています。 これらの意味については、Web サーバーのドキュメントを参照ください。
つまり、私はmax_execution_timeを180秒に設定しましたが、300秒以上の値を設定しても、こんどは、WebサーバのTimeoutの設定が優位になるので300秒以上に設定する意味がありません。