数千のcronジョブを削除する


16

非アクティブ化および削除されたプラグインからWordPressデータベースに29,000のcronジョブがあることを発見しました。多数のオプティマイザープラグインを試しましたが、膨大な数のcronジョブがあるため、プラグインを使用してそれらを削除することはできません。

また、functions.phpでこれを試しましたが成功しませんでした。

add_action("init", "clear_crons_left");
function clear_crons_left() {
    wp_clear_scheduled_hook("cron_name");
}

cronフックで検索して削除するためにphpmyadminで使用できるSQLコマンドはありますか?


私はWP一括削除を見つけ、慎重に使用し、一度に削除するアイテムの最大数を入れます
ズウェリー

回答:


18

Privateerに迅速な返信とアドバイスをありがとう。

あなたの答えを見る前に、私はそれを回避する方法を見つけました。これは、何千もの古いcronジョブを削除するためのステップバイステップの方法であり、他の誰かに役立つかもしれません。

phpMyAdminにログオンしました。データベースをクリックしてから「検索」タブをクリックしました。「cron」と入力し、「すべてのテーブル」を選択して「実行」をクリックしました。検索結果リストをwp_optionsテーブルまでスクロールダウンしました。「参照」をクリックしました。リストの一番上にはoption_name 'cron'がありました。「編集」をクリックして、ページがロードされるのを待ちました。cronジョブのリストが表示されているボックスをクリックしました。cronリストが長すぎたため、カーソルが応答するまでに約80秒かかりました。次に、キーボードのCtrl-Aを使用してすべてを選択してから、削除ボタンを押しました。ブラウザーが削除を完了するまでに約2分かかりました(クロムがタイムアウトになったため、動作するFirefoxを試しました)。

さらに数分後、現在アクティブなプラグインのcronジョブがリストに再入力されました。9個のcronジョブがありました(29,000を超える!)。不適切にコーディングされたプラグインからの6年間のcronジョブの複製。そのうちのいくつかは試してみるために1日だけインストールしました。また、Wordfence、BackupBuddy、Nextgen Gallery、AutoOptimizerなどの一般的なプラグインからも数百もの-私はすべて過去にアンインストールしました。ターボチャージされたように私のサイトはロードされます。管理領域ははるかに高速です。管理タイムアウトエラーがなくなりました。ロード時間を短縮しようとして、ウェブサイトの最適化に多くの時間を費やしていました。ホストを移動し、ホスティングプランをアップグレードしました。古いcronジョブをすべて削除するなど、サイトの速度を上げるものはありません。モバイルダウンロード時間は20秒から6秒に短縮されました。

解決策を探してみると、ウェブサイトのパフォーマンスに対するcronジョブの影響に関する情報はほとんど見つかりませんでした。多くの人は、それはほとんど違いがなく、少数のcronジョブについては本当だと言った。しかし、WordPressサイトの誕生から何年も経って、削除されたプラグインからの古いcronジョブが何千とはいなくても、何百と膨れ上がっているのでしょうか。ユーザーにphpのメモリ制限を確認するように依頼する代わりに、致命的なメモリエラーを解決するときに、開発者がまずwp_optionsのcronジョブの数を確認するようにユーザーに依頼することをお勧めします。あなたはあなたが見つけたものに驚き/ショックを受けるかもしれません!:-)


1
同じ問題が見つかりました。cronジョブの量は今ではありませんが、データベースでは約15 MBでした。削除後、管理領域のロード時間は5〜7秒から0.3秒に減少しました。フロントエンドのロード時間が2秒から0.4秒に短縮されました。
アレクセイ

1
畜生!このソリューションは私たちを救った!このテーブルには35000のcronジョブがありました。今では説明したようにターボチャージされているようです。
リカルド

クライアントのために言及されたプラグインのいずれかをインストールすることを考えていたので、実際に知って非常に良い。そのため、パフォーマンスが徐々に低下する場合の注意点がわかりました。
lowtechsun

10

試してみる

SELECT * FROM `wp_options` WHERE option_name = 'cron'

あなたがそれを見つけたなら、あなたは試すかもしれません:

  • SQLの場合: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • ワードプレスで: update_option('cron', '');

cronオプションを削除するか、値を空のシリアル化された配列に設定する必要がある場合があります。

update_optionを使用すると、値がシリアル化された空の配列か空の文字列かがわからないため、安全です。ただし、wp-includes / options.phpをチェックインできますが、update_optionを使用すると、データベースを気にせずに適切に処理できます。


7

Wordpressのcronイベントは、WP-CLIを使用してコマンドラインからクリアすることもできます

wp cron event list
wp cron event delete your_example_event

詳細についてはwp-cli docsをご覧ください。


3
または、すべてのイベントを削除しますwp option delete cron
サミュエルエル

1
wp option delete cronオプションに何千ものcronジョブが詰め込まれている場合に機能します。これらの悪い仕事はほとんどが悪いプラグインから来て、cronを間違った方法でやっています。
スワシャタゴーシュ

6

さらに簡単な解決策は、delete_option( 'cron' );プラグインを1回呼び出すことです。自動的に追加されたすべてのcronジョブは、サイトの次回の訪問/リクエストで再び追加されます。

有効化するたびにのみ実行される1つのケース(mu)プラグインとして:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );

ありがとう、カイザー!プラグインの作成/編集に不慣れな方(簡単です!)には、functions.phpファイルでkaiserが指摘した内容を使用できます。追加して保存し、サイトをロードしてから削除して、もう一度保存してください。
プライベー

プラグインのアクティベーションで作成されたcronジョブはどうですか?これらのcronジョブは、プラグインを無効にして再アクティブ化するまで再作成されません。
アルピペゴ

まあ、それはデフォルトごとに可能はありません、これでも他の質問でも。あなたがしなければならないことは、それらのプラグインを無効化および再アクティブ化することです(〜3分作業)、または自動化された回答を検索している場合、それらのプラグインの機能を検索し、プラグイン内からトリガーします。
カイザー

1

誰かが特定のcron名(たとえば、「CRON_NAME」)をクリアしたい場合、この解決策は私のために働いた:

    $crons = _get_cron_array();
    //echo "Found total ".count($crons)."<br />";
    //Keep only the ones that don't match the cron name
    $updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
    //echo "Reduced to ".count($updated)."<br />";        
    _set_cron_array($updated);

1

1年間、保留中のcronジョブがあり、この単一のデータベースエントリに対して約5 MBのデータがありました。データベースからcronジョブを削除しました。wp-config.phpのcronジョブを無効にしました

cpanelで手動のcronジョブをセットアップします。今、私のサイトは文字通り飛んでいます。サーバーをアップグレードしてCPU / RAMを追加購入していましたが、すべてがお金と時間の無駄でした。

保留中のすべてのcronジョブを削除するには、phpmyadmin> Run queryでこのクエリを実行します。

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'

PádraigÓBeirnに感謝します。


Preetinderを歓迎します!助けになったことを嬉しく思います。保留中のcronジョブのヒントもありがとう。
パドレイグÓベイル

0

この方法でcronタスクをクリアし、UpdraftPlusを使用する場合は、cronタスクを再生成するために設定を再保存する必要があります。これを行うまで、自動バックアップは実行されません(ただし、手動バックアップは実行されます)。

設定はそのままであり、何も編集する必要はありません。[UpdraftPlusトップメニュー]-> [設定]に移動し、下にスクロールして[変更を保存]をクリックします。


0

私はここにsm_ping来ましたwp_options。それがあなたの問題である場合、次を試すことができます:

phpmyadminにアクセスできない場合、特にcronジョブ(sm_ping)でサイトが肥大化している場合は、これをfunctions.php(子テーマ)に入れます。

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}

0

同様の問題に遭遇しました。自分のコーディングエラーの1つが原因で、1つの特定のcronジョブの何千ものコピーがサイトに追加されていました。wp_clear_scheduled_hook関数はタイムアウトして失敗したようです。配列内のcron関数のすべてのインスタンスを設定解除し、オプションテーブルの新しいcronオプションとしてフィルター処理された配列を追加するスクリプトで回避しました。下記参照。

このようにして、以前にサイトに追加された望ましいcronジョブを吹き飛ばすことを避けました。

これは、削除するハンドルの配列または保存するハンドルの配列を受け取る関数として変更できます。

$crons = _get_cron_array();
    $hook = 'tj_flush_w3tc_cache';
    foreach ( $crons as $timestamp => $cron ) {
    if ( isset( $cron[ $hook ] ) ) {
        unset($cron[$hook]);
    }
    if(!empty($cron))
        $newcron[$timestamp] = $cron;       
    }
    update_option('cron',$newcron);

0

すべてのcronイベントを削除する方法は非常に簡単です。前に、wp-configでWP Cronを無効にする必要があります。次に、プラグインWPコントロールをインストールし、[ツール]メニュー> [Cronイベント]> [すべて選択]> [すべて削除]をクリックします。やってみてください。ありがとう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.