Очистка "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;}
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.
Когда ваш массив 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'
],
];
} );
Вам следует ознакомиться с этим плагином разработчика. Это дает вам прекрасный контроль при работе с cron. https://wordpress.org/plugins/wp-crontrol/
Я бы также переосмыслил ваши процессы cron. Похоже, вам может потребоваться некоторая очистка после cron, встроенная в ваш код. Но я просто размышляю здесь.
Спасибо за все ваши комментарии. Я сам нашел решение.
Причина в крючке действия, который мы должны использовать таким образом. в противном случае функция будет вызываться на каждой загружаемой странице. итак, вот код, который я использовал для его решения.
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", после чего ваши записи будут созданы автоматически.
Я надеюсь, что это поможет кому-то, кто застрял на той же проблеме. если бы мое решение помогло кому-нибудь проголосовать за него.