删除数千个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");
}

我可以在phpmyadmin中使用任何SQL命令通过cron hook搜索并将其删除吗?


我发现WP批量删除,以小心使用,并把项目的最大删除一次
Zwelly

Answers:


18

感谢Privateer的迅速答复和建议。

在找到您的答案之前,我已经找到解决方法。这是删除数千个旧cron作业的分步方法,可能对其他人有用。

我登录到phpMyAdmin。我单击了数据库,然后单击“搜索”选项卡。我输入“ cron”,然后选择“所有表”,然后单击“转到”。我将搜索结果列表向下滚动到wp_options表。我点击“浏览”。列表的顶部是option_name'cron'。我单击“编辑”,然后等待页面加载。我单击了显示cron作业列表的框。cron列表是如此之长,以至于我的光标花了大约80秒来响应。然后,我在按下删除按钮之前使用键盘上的Ctrl-A来选择所有内容。我的浏览器完成了大约2分钟的删除操作(Chrome浏览器超时,因此我尝试运行Firefox)。

再过几分钟,我当前活动插件的cron作业重新填充了列表。有9个Cron职位(从超过29,000个职位减少!)。六年来重复的cron作业来自编码错误的插件,其中一些我刚刚安装了一天以进行试用。还有数百个常用插件,例如Wordfence,BackupBuddy,Nextgen Gallery和AutoOptimizer,这些都是我以前卸载的。现在,我的网站已经加载完毕,就像涡轮增压一样。管理区域要快得多。管理员超时错误已消失。我花了很多时间在优化网站上,以减少加载时间。我什至移动了主机并升级了主机计划。没有比删除所有过时的cron作业更快的速度了。移动下载时间从20秒减少到6秒。

在寻找解决方案时,我发现很少有关于cron作业对网站性能的影响的信息。许多人说这没什么大不了的,对于少数的cron作业来说是真的。但是,进入WordPress网站的生命已经过去了几年,我想知道有多少人因已删除插件产生的数百个旧cron作业而肿。建议解决问题的致命内存错误时,建议开发人员首先要求用户检查wp_options中的cron作业数量,而不是要求用户检查其php内存限制。您可能会对发现的内容感到惊讶/震惊!:-)


1
我发现了同样的问题。我现在没有多少cron作业,但是数据库中大约有15 Mb。删除后,管理区域的加载时间从5-7秒减少到0.3秒。前端加载时间从2秒减少到0.4秒。
Alexey 2015年

1
该死的!这个解决方案救了我们!该表中有35000个cron作业。现在看来像所述的那样增压了。
Riccardo

确实非常了解,因为我正在考虑为客户端安装上述插件之一。所以现在我知道性能缓慢下降时要注意什么。
lowtechsun

10

尝试

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

如果找到它,可以尝试:

  • 在SQL中: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • 在wordpress中: update_option('cron', '');

您可能需要删除cron选项或将值设置为空的序列化数组。

使用update_option会更安全,因为我不确定该值是序列化的空数组还是空字符串。您可以尽管登录wp-includes / options.php ...,但是使用update_option可以正确处理它而不必担心数据库。


7

还可以使用WP-CLI从命令行清除Wordpress cron事件:

wp cron event list
wp cron event delete your_example_event

wp-cli docs中有更多详细信息。


3
或删除所有事件wp option delete cron
Samuel Elh '18

1
wp option delete cron选件中包含数千个cron作业时,此选项有效。这些不良工作主要来自不良插件,以错误的方式进行了cron。
Swashata Ghosh

6

一个更简单的解决方案是delete_option( 'cron' );在某个插件中调用一次。所有自动添加的cron作业都会在您下次访问/请求站点时再次添加。

作为一个单例(mu)插件,仅在您激活该插件时才运行:

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

谢谢凯撒!对于那些不喜欢创建/编辑插件的人(这很简单!),您可以使用functions.php文件中指出的kaiser。只需添加,保存,加载网站,然后将其删除并再次保存即可。
私人2015年

在插件激活时创建的cron作业怎么样?在取消并重新激活插件之前,不会重新创建这些cron作业。
alpipego

好吧,默认情况下不可能做到这一点,无论是与此问题还是与其他问题无关。您需要做的是停用并重新激活这些插件(工作约3分钟),或者-如果您正在寻找自动答案,请在这些插件中搜索功能并从您的插件中触发它们。
kaiser

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

我一年都有大量待处理的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工作的提示。
—PádraigÓBeirn

0

如果您以这种方式清除了cron任务并使用UpdraftPlus,则需要重新保存设置才能重新生成cron任务。在执行此操作之前,您的自动备份将不会运行(但将执行手动备份)。

设置仍将存在,您无需进行任何编辑。只需转到[UpdraftPlus顶部菜单]->“设置”,然后向下滚动到底部,然后单击“保存更改”。


0

我之所以来到这里是因为大量的sm_pingcronjobs wp_options。如果这是您的问题,则可以尝试以下操作:

如果您无权访问phpmyadmin,则将其放在functions.php(子主题)中,尤其是当您的站点因ping cronjobs(sm_ping)而肿时:

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

0

我遇到了类似的问题,由于我自己的编码错误之一,一个特定的cron作业的数千份副本已添加到站点。wp_clear_scheduled_hook函数似乎超时并失败。我用一个脚本解决了这个问题,该脚本取消设置数组内cron函数的所有实例,然后将过滤后的数组作为新的cron选项添加到options表中。见下文。

这样,我避免了浪费以前添加到该站点的理想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。然后,安装Plugin WP Control。然后,移至“工具”菜单>“ Cron事件”>单击“全部选择”>“全部删除”。你可以尝试一下。谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.