Видаліть тисячі завдань з крон


16

Я виявив, що в моїй базі даних WordPress є 29 000 робочих місць з деактивованих та видалених плагінів. Я спробував декілька плагінів оптимізатора, але величезна кількість робіт cron означає, що я не можу видалити їх за допомогою плагінів.

Я також спробував це в своїх функціях.php без успіху:

add_action("init", "clear_crons_left");
function clear_crons_left() {
    wp_clear_scheduled_hook("cron_name");
}

Чи є якась команда SQL, яку я можу використовувати у phpmyadmin для пошуку за допомогою кронштейна та видалення їх?


Я знайшов WP Bulk delete, використовуйте обережно і поставте максимум елементів для видалення відразу
Zwelly

Відповіді:


18

Дякую приватнику за швидку відповідь та пораду.

Я знайшов шлях, перш ніж побачив вашу відповідь. Ось покроковий метод для видалення тисяч старих завдань Cron, який може бути корисним комусь іншому.

Я увійшов у phpMyAdmin. Я натиснув на свою базу даних, а потім на вкладку "Пошук". Я набрав "cron", потім вибрав "всі таблиці" і натиснув "Go". Я прокрутив униз списку результатів пошуку до своєї таблиці wp_options. Я натиснув "Огляд". У верхній частині списку було вказано параметр_ ім'я 'cron'. Я натиснув "Редагувати", а потім чекав, коли сторінка завантажиться. Я натиснув на поле, в якому було показано перелік робочих місць із запитом на роботу. Список хронів був настільки довгим, що мій курсор відгукнувся приблизно на 80 секунд. Потім я застосував Ctrl-A на клавіатурі, щоб вибрати всі, перш ніж натиснути кнопку видалення. Минуло 2 хвилини, перш ніж мій браузер завершив видалення (хромований час вийшов, тому я спробував Firefox, який спрацював).

Ще через кілька хвилин завдання cron для моїх поточних активних плагінів повторно заповнили список. Було 9 робочих місць (в порівнянні з 29 000!). Шість років дублікатів Cron із погано закодованих плагінів, деякі з яких я щойно встановив на день, щоб спробувати. Також сотні із поширених плагінів, таких як Wordfence, BackupBuddy, Nextgen Gallery та AutoOptimizer - все це я видаляв раніше. Зараз мій сайт завантажується так, ніби він був заряджений турбо. Область адміністратора набагато швидше. Помилки часу очікування адміністратора зникли. Я витратив стільки часу на оптимізацію свого веб-сайту, намагаючись скоротити час завантаження. Я навіть перемістив хостів і вдосконалив свої плани хостингу. Ніщо не збільшувало швидкість мого веб-сайту, як видалення всіх застарілих завдань cron. Час завантаження мобільних скоротилося з 20 секунд до 6 секунд.

Під час пошуку рішення я знайшов дуже мало інформації про вплив робочих місць cron на ефективність веб-сайту. Багато хто сказав, що це мало що має значення, і для невеликої кількості робочих місць це стосується правдивих даних. Але роками з життя веб-сайту WordPress мені цікаво, скільки людей роздуваються сотнями, якщо не тисячами старих завдань на Cron зі видалених плагінів. Замість того, щоб просити користувачів перевіряти ліміт пам’яті php, я б запропонував розробникам спершу попросити користувачів перевірити кількість робіт cron у wp_options при вирішенні проблем фатальних помилок пам'яті. Ви можете бути здивовані / шоковані тим, що знайдете! :-)


1
Я знайшов ту саму проблему. Зараз я не знаю, скільки у мене було завдань, але в базі даних це було близько 15 Мб. Після видалення адміністратора область завантаження скорочується від 5-7 до 0,3 секунди. Час завантаження за кордон скоротилося з 2 до 0,4 сек.
Олексій

1
блін! це рішення врятувало нас! в цій таблиці було 35000 робочих місць. тепер він здається турбонаддувом, як описано.
Ріккардо

Дуже добре знати, адже я думав встановити один із згаданих плагінів для клієнта. Тож тепер я знаю, на що слід дивитися, коли продуктивність повільно погіршується.
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-include / options.php, хоча ... але використання update_option впорається з цим належним чином, не турбуючись про базу даних.


7

Події cron Wordpress також можна очистити з командного рядка, використовуючи WP-CLI :

wp cron event list
wp cron event delete your_example_event

Детальніше у документах wp-cli .


3
Або видалити всі подіїwp option delete cron
Самуель Ель

1
wp option delete cronпрацює, коли в налаштуваннях є тисячі завдань, розміщених у Cron. Ці погані роботи здебільшого виходять із поганих плагінів, роблячи cron неправильним чином.
Свашата Гош

6

Ще простіше рішення - зателефонувати delete_option( 'cron' );один раз у якийсь плагін. Усі автоматично додані завдання на Cron знову будуть додані під час наступного відвідування / запиту вашого сайту.

Як плагін в одному випадку (mu), який працює лише коли ви його активуєте:

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

Дякую кайзер! Для тих, кому не зручно створювати / редагувати плагіни (це просто!), Ви можете використовувати те, що кайзер зазначив у вашому файлі function.php. Просто додайте його, збережіть, завантажте свій веб-сайт, а потім видаліть і збережіть його знову.
Приватник

Що з завданнями cron, створеними при активації плагінів? Ці завдання на cron не будуть відтворені, поки ви не скасуєте та не активуєте плагін.
альпіпего

Ну, це неможливо за замовчуванням , ні з цим, ні з іншими питаннями. Що вам потрібно зробити, це або видалити та повторно активувати ці плагіни (~ 3 хвилини роботи), або - у випадку, якщо ви шукаєте автоматизовану відповідь - шукайте функції в цих плагінах та запускайте їх у своєму плагіні.
кайзер

1

Якщо хтось захотів очистити конкретну назву крона (скажімо, "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 Мб даних для цього єдиного запису в базі даних. Видалено завдання cron з бази даних. Вимкнено завдання cron у wp-config.php

Налаштуйте ручну роботу cron в cpanel. Зараз мій сайт буквально летить. Я оновлював сервери, купував більше процесора / оперативної пам’яті, але все це було марною тратою грошей і часу.

Щоб видалити всі очікувані завдання cron, запустіть цей запит у phpmyadmin> Run query:

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'

Дуже дякую Pádraig Ó Beirn.


Запрошуємо предендера! Я радий, що це допомогло. Дякуємо за підказку щодо майбутніх завдань, що перебувають у стані розробки.
Pádraig Ó Beirn

0

Якщо ви очистите завдання cron таким чином і використовуєте UpdraftPlus, вам потрібно буде знову зберегти свої настройки, щоб відновити завдання cron. Поки ви не зробите це, автоматичні резервні копії не працюватимуть (але вручну створюються резервні копії).

Налаштування все ще будуть там, і вам не потрібно нічого редагувати. Просто перейдіть у [верхнє меню UpdraftPlus] -> Налаштування, а потім прокрутіть донизу та натисніть "Зберегти зміни".


0

Я потрапив сюди через величезну кількість sm_pingкронштейнів wp_options. Якщо це ваша проблема, ви можете спробувати наступне:

Помістіть це у function.php (дочірня тема), якщо у вас немає доступу до phpmyadmin, особливо якщо ваш сайт роздутий пінг-клонінгами (sm_ping):

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

0

Я зіткнувся з подібним випуском, де через одну із моїх власних помилок кодування тисячі примірників одного конкретного завдання на роботу із крон було додано на сайт. Функція wp_clear_scheduled_hook виявилася тимчасовою і закінчилася помилкою. Я обійшов його зі скриптом, який викидає всі екземпляри функції cron у масиві, а потім додає відфільтрований масив як новий параметр 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 Cron у wp-config. Потім ви встановлюєте Plugin WP Control Потім, перейдіть до меню інструментів> Cron events> Клацніть вибрані всі> Delete all of them. Чи можете ви спробувати. Спасибі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.