Usuń tysiące zadań cron

16

Odkryłem, że mam 29 000 zadań cron w mojej bazie danych WordPress z dezaktywowanych i usuniętych wtyczek. Wypróbowałem wiele wtyczek optymalizatora, ale ogromna liczba zadań cron oznacza, że ​​nie mogę ich usunąć za pomocą wtyczek.

Próbowałem również tego w moich funkcjach.php bez powodzenia:

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

Czy jest jakieś polecenie SQL, którego mogę użyć w phpmyadmin do wyszukiwania za pomocą cron hook i usuwania ich?

Pádraig Ó Beirn
źródło
Znalazłem WP Bulk delete, używaj ostrożnie i umieściłem maksymalnie elementów do usunięcia na raz
Zwelly,

Odpowiedzi:

18

Dzięki Privateer za szybką odpowiedź i poradę.

Znalazłem sposób na obejście tego, zanim zobaczyłem twoją odpowiedź. Oto krok po kroku metoda usuwania tysięcy starych zadań cron i może być przydatna dla kogoś innego.

Zalogowałem się do phpMyAdmin. Kliknąłem bazę danych, a następnie zakładkę „Szukaj”. Wpisałem „cron”, potem wybrałem „wszystkie tabele” i kliknąłem „Idź”. Przewinąłem listę wyników wyszukiwania do mojej tabeli wp_options. Kliknąłem „Przeglądaj”. Na początku listy znajdowała się nazwa_opcji „cron”. Kliknąłem „Edytuj”, a następnie czekałem na załadowanie strony. Kliknąłem na pole pokazujące listę zadań crona. Lista cronów była tak długa, że ​​odpowiedź mojego kursora zajęła około 80 sekund. Następnie użyłem Ctrl-A na klawiaturze, aby zaznaczyć wszystkie przed naciśnięciem przycisku usuwania. Minęło około 2 minut, zanim moja przeglądarka zakończyła usuwanie (upłynął limit czasu Chrome, więc wypróbowałem Firefoksa, który zadziałał).

Po kolejnych kilku minutach zadania crona dla moich aktywnych aktywnych wtyczek ponownie wypełniły listę. Było 9 zleceń cron (w porównaniu z ponad 29 000!). Sześć lat zdublowanych zadań crona ze źle zakodowanych wtyczek, z których niektóre właśnie zainstalowałem na jeden dzień, aby wypróbować. Również setki popularnych wtyczek, takich jak Wordfence, BackupBuddy, Nextgen Gallery i AutoOptimizer - z których wszystkie odinstalowałem w przeszłości. Moja strona ładuje się teraz tak, jakby była turbodoładowana. Obszar administracyjny jest znacznie szybszy. Błędy przekroczenia limitu czasu administratora zniknęły. Spędziłem tyle czasu na optymalizacji mojej witryny, próbując skrócić czas ładowania. Przeprowadziłem nawet hosty i zaktualizowałem swoje plany hostingowe. Nic tak nie przyspieszyło mojej witryny, jak usunięcie wszystkich nieaktualnych zadań crona. Skrócono czas pobierania z telefonu komórkowego z 20 sekund do 6 sekund.

W poszukiwaniu rozwiązania znalazłem bardzo mało informacji na temat wpływu zleceń cron na wydajność witryny. Wielu twierdziło, że nie ma to większego znaczenia i jest to prawdą w przypadku niewielkiej liczby zadań cron. Ale lata w życiu witryny WordPress Zastanawiam się, ile z nich to setki, jeśli nie tysiące starych zadań cron z usuniętych wtyczek. Zamiast prosić użytkowników o sprawdzenie limitu pamięci php, sugeruję, aby programiści najpierw poprosili użytkowników o sprawdzenie liczby zadań cron w wp_options podczas rozwiązywania krytycznych błędów pamięci. Możesz być zaskoczony / zszokowany tym, co znajdziesz! :-)

Pádraig Ó Beirn
źródło
1
Znalazłem ten sam problem. Nie wiem teraz, ile mam zadań crona, ale w bazie danych było około 15 Mb. Po usunięciu obszaru administracyjnego czas ładowania zmniejszył się z 5-7 do 0,3 sekundy. Skrócono czas ładowania frontonu z 2 do 0,4 sek.
Alexey,
1
cholera! to rozwiązanie nas uratowało! Miałem 35000 zadań cron w tej tabeli. teraz wygląda na turbodoładowany zgodnie z opisem.
Riccardo,
Bardzo dobrze wiedzieć, ponieważ myślałem o zainstalowaniu jednej z wymienionych wtyczek dla klienta. Teraz wiem, na co zwrócić uwagę, gdy wydajność powoli się pogarsza.
lowtechsun
10

Próbować

SELECT * FROM `wp_options` WHERE option_name = 'cron'

Jeśli go znajdziesz, możesz spróbować:

  • W SQL: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • W wordpress: update_option('cron', '');

Może być konieczne usunięcie opcji cron lub ustawienie wartości na pustą szeregowaną tablicę.

Korzystanie z opcji update_option byłoby bezpieczniejsze, ponieważ nie jestem pewien, czy wartość powinna być serializowaną pustą tablicą, czy pustym łańcuchem. Możesz wprawić wp-include / options.php ... ale użycie update_option da sobie z tym radę bez obawy o bazę danych.

Kaper
źródło
7

Zdarzenia cron Wordpress można również usunąć z wiersza poleceń, używając WP-CLI :

wp cron event list
wp cron event delete your_example_event

Więcej szczegółów w dokumentach wp-cli .

Paul Wenzel
źródło
3
Lub usuń wszystkie wydarzeniawp option delete cron
Samuel Elh
1
wp option delete crondziała, gdy w opcjach są tysiące zadań cron. Te złe prace pochodzą głównie ze złych wtyczek, robiąc crona w niewłaściwy sposób.
Swashata Ghosh
6

Jeszcze prostszym rozwiązaniem jest wywołanie delete_option( 'cron' );raz wtyczki. Wszystkie automatycznie dodane zadania CRON zostaną dodane ponownie przy następnej wizycie / żądaniu Twojej witryny.

Jako wtyczka działająca w jednym przypadku (mu), która działa tylko za każdym razem, gdy ją aktywujesz:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
kajzer
źródło
Dzięki Kaiser! Dla tych, którzy nie czują się komfortowo w tworzeniu / edytowaniu wtyczek (to proste!), Możesz użyć tego, co zauważył Kaiser w pliku functions.php. Po prostu dodaj, zapisz, załaduj witrynę, a następnie usuń i zapisz ponownie.
Kaper
Co z zadaniami cron, które zostały utworzone podczas aktywacji wtyczki? Te zadania crona nie zostaną odtworzone, dopóki wtyczka nie zostanie dezaktywowana i ponownie aktywowana.
alpipego
Cóż, nie jest to możliwe domyślnie , ani z tym, ani z innymi pytaniami. To, co musisz zrobić, to albo dezaktywować i ponownie aktywować te wtyczki (~ 3 minuty pracy), albo - w przypadku szukania automatycznej odpowiedzi - wyszukaj funkcje w tych wtyczkach i uruchom je z wtyczki.
kaiser
1

W przypadku, gdy ktoś chciał wyczyścić konkretną nazwę crona (powiedz „CRON_NAME”), to rozwiązanie działało dla mnie:

    $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);
Indivision Dev
źródło
1

Miałem rok pełen oczekujących zadań crona, około 5 Mb danych dla tego pojedynczego wpisu bazy danych. Usunięto zadania cron z bazy danych. Wyłączono zadania cron w wp-config.php

Skonfiguruj ręczne zadanie CRON w cpanel. Teraz moja strona dosłownie lata. Aktualizowałem serwery, kupowałem więcej procesora / pamięci RAM, ale wszystko to strata pieniędzy i czasu.

Aby usunąć wszystkie oczekujące zadania cron, uruchom to zapytanie w phpmyadmin> Uruchom zapytanie:

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

Wielkie dzięki Pádraig Ó Beirn.

Preetinder Singh
źródło
Nie ma za co Preetinder! Cieszę się, że to pomogło. Dziękujemy za wskazówkę dotyczącą oczekujących zleceń cron.
Pádraig Ó Beirn
0

Jeśli wyczyścisz w ten sposób swoje zadania cron i użyjesz UpdraftPlus, będziesz musiał ponownie zapisać ustawienia, aby zregenerować zadania cron. Dopóki tego nie zrobisz, automatyczne kopie zapasowe nie będą działać (ale ręczne kopie zapasowe będą działać).

Ustawienia nadal będą dostępne i nie trzeba niczego edytować. Wystarczy przejść do [górnego menu UpdraftPlus] -> Ustawienia, przewiń w dół i kliknij „Zapisz zmiany”.

Rebecca
źródło
0

sm_pingPrzybyłem tu z powodu ogromnej ilości cronjobs wp_options. Jeśli to jest twój problem, możesz spróbować:

Umieść to w functions.php (motyw potomny), jeśli nie masz dostępu do phpmyadmin, szczególnie jeśli Twoja strona jest rozdęta przez ping cronjobs (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
Sitezilla
źródło
0

Zetknąłem się z podobnym problemem, w którym z powodu jednego z moich własnych błędów kodowania tysiące stron jednego konkretnego zadania crona zostało dodanych do strony. Funkcja wp_clear_scheduled_hook pojawiła się i przekroczyła limit czasu. Obejrzałem go za pomocą skryptu, który rozbroił wszystkie instancje funkcji cron w tablicy, a następnie dodaje filtrowaną tablicę jako nową opcję cron w tabeli opcji. Patrz poniżej.

W ten sposób uniknąłem zdmuchiwania pożądanych zadań crona wcześniej dodanych do strony.

Można to zmodyfikować jako funkcję, która zabiera tablicę uchwytów do wyeliminowania lub tablicę uchwytów do zachowania.

$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);
David F. Carr
źródło
0

W bardzo prosty sposób mogę usunąć wszystkie zdarzenia cron. Przedtem musisz WYŁĄCZYĆ WP Cron w wp-config. Następnie zainstaluj wtyczkę Kontrola WP Następnie przejdź do menu Narzędzia> Zdarzenia Cron> Kliknij wybierz wszystko> Usuń wszystkie. Czy możesz tego spróbować? Dzięki.

Wietrzny
źródło