从OPTIONS表中清除“cron”会有什么影响吗?

时间:2015-11-08 作者:Kvvaradha

我在WordPress网站上安排了一些活动。为此,我使用了cron作业,因此它在wp_options 桌子

几天后,我的网站速度变慢了。当我检查我的数据库时,它在cron字段中有超过2MB的数据,所以我现在考虑清理它。这会影响我的站点的cron操作吗?

我想这都是关于表中的条目。由于条目模糊,我的网站速度变慢了。这是我的代码。

wp_schedule_event(time(), \'daily\', \'kv_daily_post_expire_check\');

function kv_daily_post_expire_check() {

$the_query = get_posts( \'post_type=job&post_status=publish\' );  
foreach($the_query as $single_post) {
    $id=$single_post->ID;
    $ad_close_date=get_post_meta($id, \'ad_close_date\', true );
    if($ad_close_date!=\'\'){
        $today=date("Y-m-d");
        $ad_less_close_date=$ad_close_date-3;
        if($ad_close_date<$today){
            $update_post = array(
            \'ID\'            => $id,
            \'post_status\'   =>  \'expired\',
            \'post_type\' =>  \'job\' );
            wp_update_post($update_post);
        }   
        else if($ad_less_close_date==$today){
            $update_post = array(
            \'ID\'            => $id,
            \'post_status\'   =>  \'expired\',
            \'post_type\' =>  \'job\' );
            //wp_update_post($update_post); 
            kv_author_post_expiring_soon($id,3);
        }   
    } 
}
}
这是我的数据库表中的数据。

a:7:{i:1447098349;a:3:{s:16:"wp_version_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:17:"wp_update_plugins";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:16:"wp_update_themes";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1447099020;a:1:{s:20:"wp_maybe_auto_update";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1447141549;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141669;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141790;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141909;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}s:7:"version";i:2;}

4 个回复
最合适的回答,由SO网友:Kvvaradha 整理而成

谢谢你的评论。我自己找到了解决办法。

原因是我们必须像这样使用动作钩。否则,我们将在加载的每个页面调用该函数。这是我用来解决它的代码。

add_action( \'switch_theme\', \'kv_event_scheduler\' );

function kv_event_scheduler() { 
    wp_schedule_event(time(), \'daily\', \'kv_daily_post_expire_check\');
}
在这里,在主题更改之后,函数将只挂接一次。所以它只会被钩住一次。cron每天只工作一次。

而且清除cron选项值也会影响功能。但你不必为此担心。一旦您像下面这样更改此函数,它将自动创建条目。

 add_action( \'after_setup_theme\', \'kv_event_scheduler\' );

function kv_event_scheduler() { 
    wp_schedule_event(time(), \'daily\', \'kv_daily_post_expire_check\');
}
保存此刷新页面后,将“after\\u setup\\u theme”更改为“switch\\u theme”,将自动创建条目。

我希望这一条能帮助那些陷入同样问题的人。如果我的解决方案有助于任何人投票。

SO网友:futuernorn

如果您想要一种快速的编程方式来循环您在cron wp\\u选项中的行,并且您可以直接访问站点的数据库(在本地开发环境中或在Web主机上),您可以通过命令行运行类似的操作:

mysql $YOUR_DB_NAME -e "SELECT option_value FROM wp_options WHERE option_name=\'cron\';" | php -r \'$cronArray = unserialize(file_get_contents("php://stdin")); foreach ($cronArray as $timestamp => $data) { echo $timestamp." --> ".date("c",$timestamp)."\\n"; print_r($data); }\'
我觉得,在任何其他背景之外查看这些信息有时可以很好地说明问题。上面的一个行程序将为您提供如下输出,然后可以进一步检查这些输出:

1446749050 --> 2015-11-05T18:44:10+00:00
Array
(
    [wp_version_check] => Array
        (
            [40cd750bba9870f18aada2478b24840a] => Array
            (
                [schedule] => twicedaily
                [args] => Array
                    (
                    )

                [interval] => 43200
            )

        )

)
1446751800 --> 2015-11-05T19:30:00+00:00
Array
(
[wp_maybe_auto_update] => Array
[...]
wp-cli 也是查看和编辑此类数据的最佳选择:

$ wp option delete cron
Success: Deleted \'cron\' option.
$ wp option get cron
array (
1447092802 =>
array (
\'wp_version_check\' =>
array (
  \'40cd750bba9870f18aada2478b24840a\' =>
  array (
    \'schedule\' => \'twicedaily\',
    \'args\' =>
    array (
    ),
    \'interval\' => 43200,
  ),
),
\'wp_update_plugins\' =>
[...]
重要的是要记住cron 行是WordPress自动加载的行之一。这意味着这一行中的数据必须从数据库中查询出来,并由WordPress在每次加载页面时进行处理。因此,您希望将此行的大小保持在尽可能低的水平,这是完全正确的。像@mrbobbybryant 如上所述,还有一些插件可以让您通过WordPress直接查看和编辑此行中的内容。

当试图确定什么应该或不应该是此数据的一部分时,我建议查找一种类型的多个条目或似乎不属于该类型的任何其他元素。一旦识别出这些元素,您就可以返回并找到它们的源代码,并调整cron在那里的操作方式。

此外,如果您的WordPress版本是最新的,这不应该成为一个因素,但值得一提的是,有一个bug可能会导致cron WordPress 4.3中的选项行:#33423 - Arguments switched in wp_batch_split_terms Cron Job in 4.3.

SO网友:kaiser

当Cron阵列中塞满了多个任务时,很有可能是您忘记检查队列中是否已经有未完成的任务,或者配置错误。config数组用于标识队列中的任务。这意味着如果您在以下方面存在拼写错误或其他差异wp_next_schedule() 检查和wp_schedule_event(), 然后检查就会成功,你很容易就会一次又一次地添加任务。确保你double check 那个最好在钩子和配置中都使用一个变量,以免出错。

add_action( \'wp_loaded\', function()
{
    $hook = \'your_custom_event\';

    $task = new YourCronHandler();

    // Config: An Array of arrays
    $config = [ ( include __DIR__.\'/config.php\' ), ];

    add_action( $hook, $task );

    // Make sure to not run during installation or if there\'s already a task added
    if (
        ! defined( \'WP_INSTALLING\' )
        && ! wp_next_scheduled( $hook, $config )
    ) {
        wp_schedule_event(
            time(),
            \'thirtymin\',
            $hook,
            $config
        );
    }
} );
然后只需构建处理程序:

class YourCronHandler
{
    public function __invoke( Array $config = [] )
    {
        // Bootstrap your process here
    }
}
配置可以很容易地分离为一个独立的文件。这样做将有助于使事情更易于阅读,甚至可以重用。

<?php

return [
    \'foo\' => \'bar\',
];
旁注:当您的cron作业正在运行时,WP会自动向数据库添加cron锁,因此您不必担心负载平衡器和它背后的不同服务器会多次运行同一任务。这可能不是您的问题,但在这种情况下,最好在wp-config.php 只需从单个服务器上的cron选项卡手动触发cron即可。

完成上述示例的时间间隔

如果您需要不同的时间间隔,这很容易:

add_filter( \'cron_schedules\', function( Array $schedules = [] )
{
    return $schedules + [
        \'thirtymin\' => [
            \'interval\' => HOUR_IN_SECONDS / 2,
            \'display\'  => \'Every Thirty Minutes\'
        ],
    ];
} );

SO网友:mrbobbybryant

你应该看看这个开发者插件。在使用cron时,它为您提供了良好的控制。https://wordpress.org/plugins/wp-crontrol/

我也会重新考虑你的cron流程。听起来您可能需要在代码中内置一些后cron清理。但我只是在猜测。