WP4.3.0にCPU負荷とメモリ消費が増加する不具合?対処してみた

PHP
この記事は約10分で読めます。

WordPressが重かった原因として、4.3.0の不具合があったようです。

WordPress4.3.0に不具合発見?

WordPressが重くて困って、別環境を用意して何とか復帰…でも、原因は結局分からず。

そんなところに、こんなツイートを見つけました。

当サイトでも使っているテーマ「STINGER5」の製作者の方です。

ENJOYPCLiFE.NETさんの記事に「4.3でCPU後負荷になるバグがある」というのがあるとのこと。

当サイトも8月19日頃、WordPressを4.3.0へアップグレードしていました。

CPUの高負荷と、メモリ消費量増加は23日頃に発生しているので、WordPressのアップグレードとの関連性はあまり考えていませんでした。

でも、リンク先の記事の、アップグレード後に管理画面が重くなってメモリ不足やらサーバーエラーが頻発、と自分の悩んでいた状況に似ています。

 

どうやら、「wp-includes/txonomy.php」の4,448行目、スケジュールの登録を行っているところの、第一パラメータと第二パラメータが逆になってしまっていているようです。

cron.phpで処理されていくはずなのですが、パラメータが逆になっていることで、処理できないキーが登録されている感じでしょうか。

function _wp_check_for_scheduled_split_terms() {
if ( ! get_option( 'finished_splitting_shared_terms' ) && ! wp_next_scheduled( 'wp_batch_split_terms' ) ) {
wp_schedule_single_event( 'wp_batch_split_terms', time() + MINUTE_IN_SECONDS );
}
}

UNIX時間が第一パラメータで、第二パラメータに「wp_batch_split_terms」を指定するのが正解とのことです。

wp_schedule_single_event( time() + MINUTE_IN_SECONDS , 'wp_batch_split_terms' );

どんどん登録されるスケジュール

リンク先のWordPress.orgのトピックでは、修正をした上で、不要なキーの削除方法が書かれています。

これを見ると、DBのcronのパラメータを取得して、誤って登録されたキーのものを配列から削除してセットし直すという流れのようです。

$cron_array = _get_cron_array();
if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
unset( $cron_array['wp_batch_split_terms'] );
_set_cron_array( $cron_array );
}

とりあえず、削除する前にこの配列を表示してみようと思います。

リンク先ではmu-pluginsディレクトリを作成して、その中にphpファイルを作成して実行させる方法が書かれていますが、自分的にはこの実行方法は馴染みが薄いので、プラグインとして登録してみます。(ソースは下の方に。)

プラグインを有効化すると、メニューに「Pz CronCheck」が追加されるので、押すと _get_cron_array() で取得したcronのスケジュールの配列が表示されます。

show-cron-array

では、早速表示を。

って、うわあああああああΣ(゚ロ゚)o゙

cron-array

通常がどのくらいか分かりませんが、配列数が1万6千個を超えているようです。スクロールバーが遥か遠くまで続いています。

中身を見てみたところ、「SNS Count Cache」の取得とかをスケジュールしているのが入っているようです。

というか、UNIX時間(エポック秒)を見てみると、「1440288206」=「2015/08/23 09:03:26」とかから残っているようです。

そういえば、「予約投稿」とかあまり使っていないので、cron.phpの通常実行を無効にして、サーバーの方から30分ごとに実行するようにしていました。

これは、スケジュールを沢山登録するプラグインを使うようになったのに、cron.phpの実行頻度が減って処理しきれなくなった、というのもありそうです。

不具合どうこうと別に、自分の設定がかみ合っていなかったようです。

 

正常な状態のWordPressで表示すると、一画面で収まる程度でした。

cron-array-normal

ここから記事を表示させたりすると、無意味(?)なスケジュールがどんどん増えていきます。

UNIX時間がキーになっていないので、消化できないのかも知れません。

unknown-schedule

とりあえず、修正案のとおり、「taxonomy.php」を修正してみたところ、増えなくなりました。

 

今度は登録されてしまっているスケジュールを削除します。

 $cron_array = _get_cron_array();
if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
unset( $cron_array['wp_batch_split_terms'] );
_set_cron_array( $cron_array );
}

こんな感じのコードで、

  1. cronの配列を取得
  2. キーが「wp_batch_split_terms」になっているデータがあったら
  3. 配列から削除する
  4. cronの配列に戻す

ということをやってくれるようです。

 

こっちの「cronのスケジュールからキー削除」もプラグインに組み込みました。

cron-clean

「Pz CronClear」を押すと、確認無しで実行します。

after-clean-cron

削除後。あくまでも「wp_batch_split_terms」がキーになっているデータが削除されるだけです。

UNIX時間がキーになっているものは沢山残っていますが、自然に「cron.php」が処理してくれるので、しばらく放置すると良さそうです。

 

普段は不要なプラグインとなるので、「停止」しておきましょう。

WordPress 4.3.1で対応されるらしいので、更新したらこのプラグインは削除してしまって良いと思います。

用意したプラグインのソース

「wp-content/plugins」ディレクトリ配下に、プラグイン用の適当なディレクトリを作成して、ファイルを作成します。

自分は「wp-content/plugins/pz-croncheck.php」という感じにしました。

<?php
/*
Plugin Name: Pz-CronCheck
Plugin URI: https://popozure.info
Description: cron schedule check for WP4.3.0
Version: 0.1
Author: poporon
Author URI: https://popozure.info
License: GPLv2 or later
*/
if (is_admin()) {
add_action( 'admin_menu', 'Pz_CronCheck_add_menu' );
}
function Pz_CronCheck_add_menu() {
add_menu_page( 'Pz Cron Schedule Check', 'Pz CronCheck', 'manage_options', 'pz_croncheck_check', 'Pz_CronCheck_check' );
add_menu_page( 'Pz Cron Schedule Clean', 'Pz CronClear', 'manage_options', 'pz_Croncheck_clean', 'Pz_CronCheck_clean' );
}
function Pz_CronCheck_check() {
$cron_array = _get_cron_array();
echo '<div class="warap"><h2>Cron Array</h2><table style="border: 1px solid #000;"><tr><td>';
print_r($cron_array);
echo '</td></tr></table></div>';
}
function Pz_CronCheck_clean() {
$cron_array = _get_cron_array();
if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
unset( $cron_array['wp_batch_split_terms'] );
_set_cron_array( $cron_array );
}
echo '<div class="warap"><h2>Cron Array After</h2><table style="border: 1px solid #000;"><tr><td>';
print_r($cron_array);
echo '</td></tr></table></div>';
}

「あちこちのサイトでソースを拾ってプラグインのファイルは作ったことあるけど、mu-pluginsとかってなんだ?」という方向けに用意してみました。

 

ちなみに、配列の量が少なければ、print_r を <pre>~</pre> ではさんであげると、少し見やすくなります。

echo '&lt;div class="warap"&gt;&lt;h2&gt;Cron Array&lt;/h2&gt;&lt;table style="border: 1px solid #000;"&gt;&lt;tr&gt;&lt;td&gt;';
print_r($cron_array);
echo '&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;';

echo '&lt;div class="warap"&gt;&lt;h2&gt;Cron Array&lt;/h2&gt;&lt;table style="border: 1px solid #000;"&gt;&lt;tr&gt;&lt;td&gt;';
echo '&lt;pre&gt;';
print_r($cron_array);
echo '&lt;/pre&gt;';
echo '&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;';

ZIP形式でも用意してみました

[2015/09/07追記]

一応、ZIP形式でも用意してみました。

[wpdm_package id=’8875′]

プラグイン→新規追加→プラグインをアップロード→ダウンロードしたZIPファイルを選択→インストールとしてください。

あくまでもcronのスケジュールを確認して、誤ったキーを削除するだけで、根本的に解決するものではありません。

taxonomy.php を修正しない限りは、誤ったキーもすぐに作成されてしまうと思います。

 

「これも難しい!」という場合は、4.3.1がリリースされるまで、4.2.xに戻すのが良いと思います。

では(^-^)o

コメント

タイトルとURLをコピーしました