Очистка "cron" из таблицы параметров повлияет на что-нибудь?


У меня есть несколько запланированных событий на моем сайте WordPress. Для этого я использую задание cron, поэтому оно создало опцию в таблице wp_options.

Через несколько дней мой сайт становится медленным. Когда я проверяю свою базу данных, в поле cron содержится более 2 МБ данных, поэтому я думаю очистить ее сейчас. Повлияет ли это на операции 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;}
Author: Kvvaradha, 2015-11-08

4 answers

Если вам нужен быстрый программный способ перебора всего, что у вас есть в строке cron внутри wp_options, и у вас есть прямой доступ к базе данных сайта (либо в локальной среде разработки, либо на веб-хостинге), вы можете запустить что-то подобное через командную строку:

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.

При попытке определить, что должно или не должно быть частью этих данных, я бы рекомендовал искать многочисленные записи одного типа или любые другие элементы, которые, по-видимому, им не принадлежат. Как только эти элементы будут идентифицированы, вы сможете вернуться назад и найти код, из которого они произошли, и настроить, как там работают кроны.

Кроме того, хотя это не должно быть фактором, если вы в обновленной версии WordPress стоит упомянуть, что была ошибка, которая могла привести к значительному увеличению размеров строк опций cron в WordPress 4.3: #33423 - Аргументы, переключенные в задании Cron wp_batch_split_terms в 4.3.

 3
Author: futuernorn, 2015-11-09 18:18:59

Когда ваш массив Cron заполняется более чем одной задачей, существует высокая вероятность того, что вы либо забыли проверить, есть ли уже незавершенная задача в очереди, либо у вас неправильная конфигурация. Массив конфигурации используется для идентификации задачи в очереди. Это означает, что если у вас, например, есть опечатка или какая-то другая разница между проверками wp_next_schedule() и wp_schedule_event(), то проверка будет успешной, и вы легко закончите тем, что задача будет добавляться снова и снова. Убедитесь, что вы удваиваете проверьте это. Лучше просто используйте переменную как для крючка, так и для конфигурации, чтобы не допустить этой ошибки.

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 в базу данных, поэтому вам не нужно заботиться о балансировщиках нагрузки и разных серверах за ним выполняется одна и та же задача не один раз. Это не может быть вашей проблемой, но в таких случаях лучше отключить 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'
        ],
    ];
} );
 1
Author: kaiser, 2015-11-09 00:04:03

Вам следует ознакомиться с этим плагином разработчика. Это дает вам прекрасный контроль при работе с cron. https://wordpress.org/plugins/wp-crontrol/

Я бы также переосмыслил ваши процессы cron. Похоже, вам может потребоваться некоторая очистка после cron, встроенная в ваш код. Но я просто размышляю здесь.

 0
Author: mrbobbybryant, 2015-11-08 14:10:07

Спасибо за все ваши комментарии. Я сам нашел решение.

Причина в крючке действия, который мы должны использовать таким образом. в противном случае функция будет вызываться на каждой загружаемой странице. итак, вот код, который я использовал для его решения.

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_setup_theme" на "switch_theme", после чего ваши записи будут созданы автоматически.

Я надеюсь, что это поможет кому-то, кто застрял на той же проблеме. если бы мое решение помогло кому-нибудь проголосовать за него.

 0
Author: Kvvaradha, 2015-11-11 04:04:28