WordPressのプラグインHead Cleanerのキャッシュが大きくなりすぎて消せなくなった

投稿日:

皆さんこんにちは。
知らないうちにとんでもないことをしでかしていた伊達あずさです。
物凄く久しぶりのビジネスカテゴリの記事ですが、この記事が更新されるときは大抵とんでもないことが起こってしまっているのですよね・・・

このぽっぽブログはWordPressというソフトウェアで作られているのですが、結構定期的にバージョンアップされるんですよね。
それ自体はとても有難いことですし、アップデートも1クリックで行えますので、それ自体は何の問題もないのですが、たまーにアップデートが原因でWordPressのプラグインの動作がおかしくなることがあるんです。
そりゃ、プラグインは本体ありきで作られているわけですから、アップデートによって不具合が出たとしても何らおかしくありません。

実際WordPressが4.7になったことで、いくつか動作がおかしくなるプラグインがありました。
その中の一つに「Head Cleaner」というプラグインがあったんです。
これはサイト内でも比較的負荷が大きいCSSやJavascriptをコンパクトにしてくれるという機能を持つプラグインで、ぽっぽブログにおいても開設当初からお世話になっているプラグインの1つなんです。
しかし、WordPressのバージョンを4.7にした途端、ブログの上部にエラーを吐き出すようになってしまったため、泣く泣く使用を停止していました。

停止したことでエラー自体は出力されなくなりましたが、これまでずっと愛用してきたプラグインが使えないままなのは何となく寂しい。そこで、エラーを回避すべく問題の箇所を自分で修正してみようと思ったのです。
とりあえず試しで修正してみるとエラーは出なくなりました。しかし、心配性の私は念のためHead Cleanerについて調べてみることに・・・すると、今回のエラーよりはるかに気になる情報が!

それは、「Head Cleanerが作る大量のキャッシュによってサーバーの容量が圧迫される」という情報でした。

これを見た時、ちょっと思い当たる節があったのです・・・
ぽっぽブログは比較的画像が多く使用されています。なので、日ごろから画像のサイズには気を付けてきたつもりです。
それなのに、どういうわけかサーバーの使用量が全体で数十GBもあったんですよ。
私の見積もりでは多くても500MBぐらいだと思ってたのに・・・何で?って思ってたんですよね。(どうしてその時に原因をつきとめようとしなかったんだ私!!)

不安に駆られた私は早速Head Cleanerのキャッシュ容量を確認すべく「wp-content\cache\head-cleaner」を見るわけですが、どういうわけかそこにある「js」というフォルダにアクセスできません。(多分ファイルが多すぎるのでしょう)
その後、様々なFTPソフトを試してみるも結果は変わらず・・・jsフォルダごと消そうとしてもタイムアウトしてしまうのです。

仕方ないので他の方法を取ってみることにしました。
Head cleanerはWordPressの管理画面の設定からもキャッシュを消すことができます。しかし、それもだめ。
今度は管理画面のプラグインから、Head Cleaner自体の削除を試みました。しかしそれもInternal Errorとなってしまい実行できません。
正直途方にくれました・・・どうあってもjsフォルダが消せないんです!

一時はサーバーの管理元に依頼して削除してもらおうかとも思ったんですが、何とか自分で消す方法がみつかったんです。

FTPソフトでアクセスできないフォルダの中のファイルを消す方法

コマンドプロンプトからftpコマンドを使って接続してファイルを消すという方法です。
やり方はこんな感じ。

  1. コマンドプロンプトのウィンドウを開く
  2. 「ftp」と入力
  3. 「open <接続先のホスト名>」と入力
  4. ユーザー名を入力
  5. パスワードを入力
  6. 「cd <消したいファイルがある場所>
    (~\wp-content\cache\head-cleaner\jsなど)」と入力
  7. 「prompt」と入力(これをしないと、1ファイルごとに消すかどうか尋ねられる)
  8. 「mdel *」と入力(jsフォルダの中を消すなら「mdel *.js」の方が安全)

これで消したいファイルがある場所のファイルが全て消えます。
ただ、あまりにもファイル数が多い場合は途中でタイムアウトしてしまうので、めげずに何度も同じことをしなければならないかもしれません。(実際、私は何度も繰り返す羽目になりました・・・)

1つだけ注意しなければならないのは、ファイルが沢山あるフォルダ(jsフォルダ)に「cd」で入った後はdir(ファイル名の一覧を出力するコマンド)を実行してはいけないということです。(やっちゃうとタイムアウトします)

何故Head Cleanerのキャッシュがここまで増えたのか

Head CleanerはWordPress Popular Postsと相性が悪いようです。
WordPress Popular Postsが記事のカウントをする際、記事に埋め込むjavascriptにHead Cleanerが反応して膨大なキャッシュを生み出してしまうらしいです。なので、別にHead Cleanerが悪いというわけではありません
Head CleanerとWordPress Popular Postsを併用する場合は、Head Cleanerの設定でWordPressPopularPostsを対象外に設定していればこんなことにはならなかったはずなのです。

私の場合は全てのファイルを消すのに10時間近くかかってしまいました。(325万ファイルぐらいあったみたい・・・)

もし、Head CleanerとWordPress Popular Postsを併用していて、WordPressPopularPostsを対象外に設定をしてない方が居らしたら、早急にHead Cleanerのキャッシュ量を確認してみてくださいね。
WordPressの管理画面からキャッシュを消せるうちが花ですよ?

おまけ:Head Cleanerのエラーを消すためにどう修正したか

Head Cleanerが出しているエラーは「Invalid argument supplied for foreach()…」という、foreachに型が配列でない変数を与えたり、与えた配列がnullだったりする時に出力されるものでした。
であれば、問題の変数を強制的に配列にしてしまえ!と言うことで

[head-cleaner.php line:2941付近]

foreach ($active_filters as $priority => $filters) {
  foreach ($filters as $filter) {
    $function_name = $this->_get_function_name($filter['function']);
    if ( $this->function_enabled($function_name) ) {
      if (!isset($this->filters[$tag]))
        $this->filters[$tag] = array();
      $this->filters[$tag][$function_name] = $priority;
    }
  }
}

と言う部分を

foreach ($active_filters as $priority => $filters) {
  foreach ((array)$filters as $filter) {
    $function_name = $this->_get_function_name($filter['function']);
    if ( $this->function_enabled($function_name) ) {
      if (!isset($this->filters[$tag]))
        $this->filters[$tag] = array();
      $this->filters[$tag][$function_name] = $priority;
    }
  }
}

と直してみたところ、一応エラーは出なくなりました。
ただ、完全に動作確認を取ったわけではないので、あくまでも参考程度に・・・

ビジネス記事一覧へ

Studio POPPOをフォローしませんか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください