Удалить тысячи рабочих мест cron

16

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

Я также попробовал это в моем functions.php без успеха:

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

Есть ли какая-либо команда SQL, которую я могу использовать в phpmyadmin для поиска через крючок cron и удаления их?

Pádraig Ó Beirn
источник
Я нашел WP Bulk delete, используйте осторожно и поместил максимум элементов для удаления сразу
Zwelly

Ответы:

18

Спасибо Privateer за быстрый ответ и совет.

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

Я вошел в phpMyAdmin. Я нажал на свою базу данных, а затем на вкладку «Поиск». Я набрал 'cron', затем выбрал 'all tables' и нажал 'Go'. Я прокрутил список результатов поиска до своей таблицы wp_options. Я нажал «Обзор». В верхней части списка было имя_свойства 'cron'. Я нажал «Редактировать», затем дождался загрузки страницы. Я нажал на поле с списком заданий cron. Список cron был настолько длинным, что моему курсору потребовалось около 80 секунд, чтобы ответить. Затем я использовал Ctrl-A на клавиатуре, чтобы выбрать все, прежде чем нажать кнопку удаления. Прошло около 2 минут, прежде чем мой браузер завершил удаление (тайм-аут chrome, поэтому я попробовал Firefox, который работал).

Еще через пару минут задания cron для моих текущих активных плагинов снова заполнили список. Было 9 рабочих мест (по сравнению с 29 000!). Шесть лет дублирующих заданий cron из плохо закодированных плагинов, некоторые из которых я только что установил на день, чтобы опробовать. Также сотни из распространенных плагинов, таких как Wordfence, BackupBuddy, Nextgen Gallery и AutoOptimizer - все это я удалил в прошлом. Мой сайт теперь загружается так, как будто у него турбонаддув. Область администратора намного быстрее. Ошибки тайм-аута администратора исчезли. Я потратил так много времени на оптимизацию своего сайта, пытаясь уменьшить время загрузки. Я даже перенес хосты и обновил свои планы хостинга. Ничто так не увеличивало скорость моего сайта, как удаление всех устаревших заданий cron. Время загрузки с мобильного телефона уменьшилось с 20 до 6 секунд.

В поисках решения я обнаружил очень мало информации о влиянии заданий cron на производительность веб-сайта. Многие говорили, что это мало что меняет, и для небольшого числа рабочих мест это правда. Но многие годы жизни сайта WordPress меня интересует, сколько их раздувается сотнями, если не тысячами старых заданий cron из удаленных плагинов. Вместо того, чтобы просить пользователей проверить предел памяти php, я бы предложил разработчикам сначала попросить пользователей проверить количество заданий cron в wp_options при решении проблем с фатальными ошибками памяти. Вы можете быть удивлены / шокированы тем, что вы найдете! :-)

Pádraig Ó Beirn
источник
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-includes / options.php, хотя ... но использование update_option будет обрабатывать его правильно, не беспокоясь о базе данных.

капер
источник
7

События Wordpress cron также можно удалить из командной строки, используя 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 неправильно.
Swashata Ghosh
6

Еще более простое решение - delete_option( 'cron' );один раз вызвать какой-нибудь плагин. Все автоматически добавленные задания cron будут добавлены снова при следующем посещении / запросе вашего сайта.

Как плагин one case (mu), который запускается только при активации:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
кайзер
источник
Спасибо, Кайзер! Для тех, кому неудобно создавать / редактировать плагины (это просто!), Вы можете использовать то, что kaiser отметил в вашем файле functions.php. Просто добавьте его, сохраните, загрузите ваш сайт, затем удалите его и сохраните снова.
Капер
Как насчет заданий cron, которые были созданы при активации плагина? Эти задания cron не будут воссозданы, пока вы не деактивируете и не активируете плагин.
alpipego
Ну, это невозможно по умолчанию , ни с этим, ни с другими вопросами. Вам нужно будет либо деактивировать и повторно активировать эти плагины (~ 3 минуты работы), либо - в случае, если вы ищете автоматический ответ - найти функции в этих плагинах и запустить их из вашего плагина.
Кайзер
1

В случае, если кто-то хочет очистить определенное имя cron (например, «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. Сейчас мой сайт буквально летает. Я обновлял серверы, покупал больше CPU / RAM, но все было пустой тратой денег и времени.

Чтобы удалить все ожидающие задания cron, выполните этот запрос в phpmyadmin> Выполнить запрос:

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

Большое спасибо Pádraig Ó Beirn.

Претиндер Сингх
источник
Не за что Preetinder! Я рад, что это помогло. Спасибо за отзыв о незавершенных работах cron.
Pádraig Ó Beirn
0

Если вы очистите свои задачи cron таким образом и используете UpdraftPlus, вам потребуется повторно сохранить настройки, чтобы восстановить задачи cron. Пока вы не сделаете это, ваши автоматические резервные копии не будут работать (но резервные копии будут выполняться вручную).

Настройки все еще будут там, и вам не нужно ничего редактировать. Просто зайдите в [верхнее меню UpdraftPlus] -> Настройки, прокрутите вниз и нажмите «Сохранить изменения».

Ребекка
источник
0

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

Поместите это в functions.php (дочерняя тема), если у вас нет доступа к phpmyadmin, особенно если ваш сайт раздут с ping cronjobs (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
Sitezilla
источник
0

Я столкнулся с подобной проблемой, когда из-за одной из моих собственных ошибок кодирования тысячи копий одного конкретного задания cron были добавлены на сайт. Похоже, что функция wp_clear_scheduled_hook отключилась. Я обошел его с помощью скрипта, который сбрасывает все экземпляры функции cron в массиве, а затем добавляет отфильтрованный массив в качестве нового параметра 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»> «Выделить все»> «Удалить все». Не могли бы вы попробовать это? Благодарю.

Ветреный
источник