Delete thousands of cron jobs

时间:2015-01-24 作者:Pádraig Ó Beirn

我发现我的WordPress数据库中有29000个cron作业,来自停用和删除的插件。我尝试了许多优化器插件,但大量的cron作业意味着我无法使用插件删除它们。

我也在我的函数中尝试了这一点。php未成功:

add_action("init", "clear_crons_left");
function clear_crons_left() {
    wp_clear_scheduled_hook("cron_name");
}
在phpmyadmin中是否有任何SQL命令可用于通过cron hook进行搜索并删除它们?

10 个回复
最合适的回答,由SO网友:Pádraig Ó Beirn 整理而成

感谢Privateer的及时回复和建议。

在我看到你的答案之前,我就找到了解决的办法。下面是一个逐步删除数千个旧cron作业的方法,可能对其他人有用。

我登录到phpMyAdmin。我单击了我的数据库,然后单击了“搜索”选项卡。我输入“cron”,然后选择“all tables”,然后单击“Go”。我将搜索结果列表向下滚动到我的wp\\U选项表。我单击了“浏览”。列表顶部是option\\u name“cron”。我单击“编辑”,然后等待页面加载。我单击了显示cron作业列表的框。cron列表很长,我的光标大约花了80秒才做出响应。然后,我在键盘上使用Ctrl-A选择all,然后单击delete按钮。我的浏览器大约用了2分钟才完成删除(chrome超时,所以我尝试了Firefox,它可以正常工作)。

再过几分钟,我当前活动插件的cron作业重新填充了列表。共有9个cron职位(低于29000多个!)。六年来,我一直在用编码糟糕的插件复制cron作业,其中一些插件我只是安装了一天来试用。还有数百个常用插件,如Wordfence、BackupBuddy、Nextgen Gallery和AutoOptimizer,所有这些都是我过去卸载的。我的网站现在加载起来就像涡轮增压一样。管理区要快得多。管理超时错误已消失。我花了很多时间优化我的网站,试图减少加载时间。我甚至移动了主机并升级了我的主机计划。没有什么比删除所有过时的cron作业更能提高我的站点速度了。移动下载时间从20秒减少到6秒。桌面下载时间从大约12秒减少到4秒。

在我寻找解决方案的过程中,我发现很少有关于cron作业对网站性能影响的信息。许多人说,这并没有什么不同,对于少数cron工作来说,这是真的。但在WordPress网站存在多年后,我想知道有多少网站被删除的插件中的数百个(如果不是数千个)旧cron工作所淹没。我建议开发人员在解决致命内存错误时,首先让用户检查wp\\u选项中的cron作业数,而不是让用户检查他们的php内存限制。你可能会对你的发现感到惊讶/震惊!:-)

SO网友:Paul Wenzel

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

wp cron event list
wp cron event delete your_example_event
更多详细信息,请参阅wp-cli docs.

SO网友:Privateer

尝试

SELECT * FROM `wp_options` WHERE option_name = \'cron\'
如果您找到了,可以尝试:

SQL中:UPDATE wp_options SET option_value = \'\' WHERE option_name = \'cron\'update_option(\'cron\', \'\');您可能需要删除cron选项或将该值设置为空的序列化数组。

使用update\\u选项会更安全,因为我不确定该值应该是序列化的空数组还是空字符串。您可以签入wp includes/options。php虽然。。。但是使用update\\u选项可以正确地处理它,而不用担心数据库。

SO网友:kaiser

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

作为一个仅在激活时运行的单案例(mu)插件:

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

SO网友:Indivision Dev

如果有人想清除一个特定的cron名称(比如“cron\\u 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);

SO网友:David F. Carr

我遇到了一个类似的问题,由于我自己的一个编码错误,一个特定cron作业的数千个副本被添加到了一个站点。wp\\u clear\\u scheduled\\u 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);

SO网友:Preetinder Singh

我有一年的时间都在等待cron的工作,这个数据库条目大约有5 Mb的数据。已从数据库中删除cron作业。在wp config中禁用了cron作业。php

在cpanel中设置手动cron作业。现在我的网站真的在飞。我一直在升级服务器,购买更多的CPU/RAM,但这一切都是浪费金钱和时间。

要删除所有挂起的cron作业,请在phpmyadmin>运行查询中运行此查询:

UPDATE wp_options SET option_value = \'\' WHERE option_name = \'cron\'
非常感谢PádraigÓBeirn。

SO网友:Windy

我有一种非常简单的方法来删除所有cron事件。之前,您需要在WP Config中禁用WP Cron,然后安装插件WP control,然后移动到工具菜单>Cron事件>单击全选>全部删除。你能试试吗。谢谢

SO网友:Rebecca

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

设置仍然存在,您不需要编辑任何内容。只需进入[UpdraftPlus顶部菜单]->设置,然后向下滚动到底部并单击“保存更改”。

SO网友:Sitezilla

我来这里是因为sm_ping 中的cronjobswp_options. 如果这是您的问题,您可以尝试以下方法:

将其放入函数中。php(子主题),如果您无法访问phpmyadmin,尤其是如果您的站点充斥着ping cronjobs(sm\\u ping),请执行以下操作:

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

结束

相关推荐

由于在cron cPanel文件中加载核心文件,WordPress.org不允许我的插件

我制作了一个插件并尝试在wordpress上安装。org但Wordpress给我的错误消息是##直接调用核心加载文件是不正确的。我在插件中使用了一个cron文件。这个cron也可以通过CPanel设置。这就是为什么我必须包括\'wp-config.php\' 我将此作为include \'../../../wp-config.php\'; 我的cron文件路径是这样的https://www.abc.com/wp-content/plugins/klicktip/cron_execute.php?