私はWordPressデータベースに無効化されたプラグインと削除されたプラグインから29,000のcronジョブがあることを発見しました。私はいくつかのオプティマイザプラグインを試してみましたが、膨大な数のcronジョブがあるため、プラグインを使用してそれらを削除することはできません。
私はfunctions.phpでも成功せずにこれを試しました:
add_action("init", "clear_crons_left");
function clear_crons_left() {
wp_clear_scheduled_hook("cron_name");
}
Phpmyadminでcronフックで検索して削除するために使用できるSQLコマンドはありますか?
迅速な返答とアドバイスをくれてありがとうPrivateer。
私はあなたの答えを見る前にそれを回避する方法を見つけました。これは、何千もの古いcronジョブを削除するための段階的な方法です。他の人にも役立つでしょう。
私はphpMyAdminにログオンしました。私は自分のデータベースをクリックしてから「検索」タブをクリックしました。 「cron」と入力してから「all tables」を選択し、「Go」をクリックしました。検索結果リストを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秒に短縮されました。デスクトップのダウンロード時間は約12秒から4秒に短縮されました。
解決策を探しても、cronの仕事がWebサイトのパフォーマンスに与える影響に関する情報はほとんど見つかりませんでした。多くの人がそれはほとんど違いがないと言いました、そして、少数のcron仕事のためにそれは本当です。しかし、WordPressサイトが立ち上がってから何年も経って、削除されたプラグインから何千もの古いcronジョブが膨大に膨れ上がるのではないでしょうか。ユーザにphpメモリの制限をチェックするように依頼する代わりに、致命的なメモリエラーを解決するときに、開発者が最初にwp_optionsのcronジョブの数をチェックするようにユーザに依頼することをお勧めします。あなたはあなたが見つけたものに驚くかもしれません/ショックを受けるかもしれません! :-)
やってみる
SELECT * FROM `wp_options` WHERE option_name = 'cron'
あなたがそれを見つけたならあなたは試すかもしれません:
UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
update_option('cron', '');
Cronオプションを削除するか、値を空の直列化配列に設定する必要があるかもしれません。
値が直列化された空の配列か空の文字列かがわからないので、update_optionの使用はより安全です。ただし、wp-includes/options.phpをチェックインすることもできますが、update_optionを使用するとデータベースを気にせずに正しく処理できます。
Wordpressのcronイベントは、 WP-CLI を使用して、コマンドラインから消去することもできます。
wp cron event list
wp cron event delete your_example_event
詳細は wp-cliのドキュメント にあります。
もっと簡単な解決策は、プラグインの中でdelete_option( 'cron' );
を一度呼び出すことです。自動的に追加されたすべてのcronジョブは、あなたのサイトの次の訪問/要求で再び追加されます。
あなたがそれをアクティブにしたときにだけ実行されるワンケース(mu)プラグインとして:
<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
delete_option( 'cron' );
} );
誰かが特定の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つのデータベースエントリに約5 Mbのデータ、保留中のcronジョブが1年あふれていました。データベースから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。
私は自分自身のコーディングエラーのために、ある特定の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);
すべてのcronイベントを簡単に削除する方法があります。以前は、wp-configでDISABLE WP Cronを実行する必要があります。次に、Plugin WP Controlをインストールします。次に、[ツール]メニュー> [Cronイベント]> [すべて選択]> [すべて削除]をクリックします。試してもらえますか。ありがとう。
この方法でクーロン・タスクをクリアしてUpdraftPlusを使用した場合は、クーロン・タスクを再生成するために設定を再保存する必要があります。これが行われるまで、自動バックアップは実行されません(手動バックアップは実行されます)。
設定はそのまま残りますので、何も編集する必要はありません。 [UpdraftPlusトップメニュー] - > [設定]を選択し、一番下までスクロールして[変更を保存]をクリックするだけです。
sm_ping
にはwp_options
cronjobが大量にあるため、ここに来ました。それがあなたの問題であるならば、あなたは以下を試みることができます:
Phpmyadminにアクセスできない場合、特にあなたのサイトがping cronjobs(sm_ping)で肥大化している場合は、これをfunctions.php(子テーマ)に入れてください:
if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}