Eliminare migliaia di cron job

24 gen 2015, 20:48:30
Visualizzazioni: 29.8K
Voti: 18

Ho scoperto di avere 29.000 cron job nel mio database WordPress provenienti da plugin disattivati ed eliminati. Ho provato diversi plugin di ottimizzazione ma l'enorme numero di cron job impedisce di eliminarli utilizzando i plugin.

Ho anche provato questo nel mio functions.php senza successo:

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

Esiste un comando SQL che posso utilizzare in phpMyAdmin per cercare per hook cron e rimuoverli?

1
Commenti

Ho trovato WP Bulk delete, usalo con cautela e imposta un numero massimo di elementi da eliminare alla volta

Zwelly Zwelly
7 nov 2019 13:05:17
Tutte le risposte alla domanda 11
4
20

Grazie Privateer per la rapida risposta e i consigli.

Ho trovato una soluzione alternativa prima di vedere la tua risposta. Ecco un metodo passo-passo per eliminare migliaia di vecchi cron job che potrebbe essere utile a qualcun altro.

Mi sono collegato a phpMyAdmin. Ho cliccato sul mio database e poi sulla scheda 'cerca'. Ho digitato 'cron', selezionato 'tutte le tabelle' e cliccato su 'Vai'. Ho scorso la lista dei risultati fino alla tabella wp_options. Ho cliccato su 'Sfoglia'. In cima alla lista c'era option_name 'cron'. Ho cliccato 'Modifica' e atteso il caricamento della pagina. Ho cliccato sulla casella che mostrava l'elenco dei cron job. La lista era così lunga che ci sono voluti circa 80 secondi prima che il cursore rispondesse. Ho quindi usato Ctrl-A sulla tastiera per selezionare tutto prima di premere il pulsante elimina. Ci sono voluti circa 2 minuti prima che il browser completasse l'eliminazione (Chrome ha dato timeout, quindi ho provato con Firefox che ha funzionato).

Dopo un altro paio di minuti, i cron job dei miei plugin attualmente attivi hanno ripopolato la lista. C'erano 9 cron job (in calo da oltre 29.000!). Sei anni di cron job duplicati da plugin programmati male, alcuni dei quali avevo installato solo per un giorno per provarli. Inoltre centinaia da plugin comuni come Wordfence, BackupBuddy, Nextgen Gallery e AutoOptimizer - tutti disinstallati in passato. Il mio sito ora si carica come se fosse turbo-alimentato. L'area di amministrazione è molto più veloce. Gli errori di timeout nell'admin sono scomparsi. Avevo passato così tanto tempo a ottimizzare il mio sito web cercando di ridurre il tempo di caricamento. Ho persino cambiato host e aggiornato i piani di hosting. Niente ha aumentato la velocità del mio sito come l'eliminazione di tutti i vecchi cron job. Il tempo di download su mobile è sceso da 20 secondi a 6 secondi. Su desktop è passato da circa 12 a 4 secondi.

Nella mia ricerca di una soluzione ho trovato pochissime informazioni sull'effetto dei cron job sulle prestazioni del sito. Molti dicevano che faceva poca differenza e per un piccolo numero di cron job è vero. Ma dopo anni di vita di un sito WordPress, mi chiedo quanti siano appesantiti da centinaia se non migliaia di vecchi cron job da plugin eliminati. Invece di chiedere agli utenti di controllare il limite di memoria PHP, suggerirei agli sviluppatori di far controllare prima il numero di cron job in wp_options quando si risolvono errori fatali di memoria. Potreste rimanere sorpresi/scioccati da ciò che trovate! :-)

31 gen 2015 18:29:00
Commenti

Ho riscontrato lo stesso problema. Non so quanti cron job avessi, ma occupavano circa 15 Mb nel database. Dopo l'eliminazione, il tempo di caricamento dell'area admin è diminuito da 5-7 a 0,3 secondi. Il tempo di caricamento del frontend è sceso da 2 a 0,4 secondi.

Alexey Alexey
5 set 2015 23:10:04

Accidenti! Questa soluzione ci ha salvato! Avevamo 35000 cron job in questa tabella. Ora sembra turbo come descritto.

Riccardo Riccardo
14 set 2015 14:41:30

Molto utile da sapere, visto che stavo pensando di installare uno dei plugin menzionati per un cliente. Ora so a cosa prestare attenzione quando le prestazioni si deteriorano lentamente.

lowtechsun lowtechsun
28 giu 2018 01:24:21

Mi hai salvato il culo. Grazie

MT3 MT3
7 mar 2023 18:28:05
2
11

Gli eventi cron di WordPress possono anche essere cancellati dalla riga di comando, utilizzando WP-CLI:

wp cron event list
wp cron event delete your_example_event

Maggiori dettagli nella documentazione di wp-cli.

9 feb 2017 17:57:41
Commenti

Oppure elimina tutti gli eventi wp option delete cron

Ismail Ismail
20 apr 2018 01:12:32

wp option delete cron funziona quando ci sono migliaia di cron job accumulati nelle opzioni. Questi job problematici derivano principalmente da plugin malfunzionanti che gestiscono i cron in modo errato.

Swashata Ghosh Swashata Ghosh
6 apr 2019 12:28:20
1
10

Prova

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

Se lo trovi potresti provare:

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

Potresti aver bisogno di eliminare l'opzione cron o impostare il valore su un array serializzato vuoto.

Usare update_option sarebbe più sicuro poiché non sono certo se il valore dovrebbe essere un array serializzato vuoto o una stringa vuota. Potresti controllare in wp-includes/options.php... ma usando update_option verrà gestito correttamente senza preoccuparti del database.

24 gen 2015 21:16:47
Commenti

Non farlo mai! Questo eliminerà anche i lavori cron predefiniti impostati da WordPress, che sono necessari per un utilizzo normale.

peixotorms peixotorms
13 apr 2020 13:39:10
3

Una soluzione ancora più semplice è chiamare delete_option( 'cron' ); una volta in qualche plugin. Tutti i cron job aggiunti automaticamente verranno reinseriti alla prossima visita/richiesta del tuo sito.

Come plugin one-case (mu) che viene eseguito solo quando lo attivi:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
10 ott 2015 21:33:51
Commenti

Grazie kaiser! Per chi non si sente a proprio agio nel creare/modificare plugin (è semplice!), puoi usare quello che kaiser ha segnalato nel tuo file functions.php. Basta aggiungerlo, salvarlo, caricare il sito, poi rimuoverlo e salvarlo di nuovo.

Privateer Privateer
10 ott 2015 23:02:18

E i cron job che sono stati creati all'attivazione del plugin? Questi cron job non verrebbero ricreati finché non disattivi e riattivi il plugin.

alpipego alpipego
15 mar 2016 23:30:48

Beh, questo non è possibile di default, né con questo né con le altre domande. Quello che dovresti fare è disattivare e riattivare quei plugin (~3 minuti di lavoro), oppure – nel caso stessi cercando una risposta automatizzata – cercare le funzioni in quei plugin e attivarle dal tuo plugin.

kaiser kaiser
15 mar 2016 23:36:20
0

Nel caso qualcuno volesse cancellare un nome specifico di cron (ad esempio 'CRON_NAME'), questa soluzione ha funzionato per me:

    $crons = _get_cron_array();
    //echo "Trovati totali ".count($crons)."<br />";
    //Mantieni solo quelli che non corrispondono al nome del cron
    $updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
    //echo "Ridotti a ".count($updated)."<br />";        
    _set_cron_array($updated);
9 ago 2016 13:17:27
1

Ho avuto un anno pieno di lavori cron in sospeso, circa 5 Mb di dati per questa singola voce del database. Ho eliminato i lavori cron dal database. Ho disabilitato i lavori cron in wp-config.php

Ho configurato un lavoro cron manuale in cPanel. Ora il mio sito vola letteralmente. Avevo continuato a potenziare i server, acquistando più CPU/RAM, ma è stato tutto uno spreco di tempo e denaro.

Per eliminare tutti i lavori cron in sospeso, esegui questa query in phpmyadmin > Esegui query:

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

Grazie mille Pádraig Ó Beirn.

11 gen 2017 22:40:02
Commenti

Preetinder, prego! Sono felice che ti sia stato utile. Grazie anche per il suggerimento sui lavori cron in sospeso.

Pádraig Ó Beirn Pádraig Ó Beirn
12 gen 2017 21:16:58
0

Mi sono imbattuto in un problema simile, dove a causa di un mio errore di codifica, migliaia di copie di un particolare cron job erano state aggiunte a un sito. La funzione wp_clear_scheduled_hook sembrava andare in timeout e fallire. Sono riuscito a risolverlo con uno script che rimuove tutte le istanze della funzione cron dall'array e poi aggiunge l'array filtrato come nuova opzione cron nella tabella delle opzioni. Vedi sotto.

In questo modo, ho evitato di eliminare i cron job desiderabili precedentemente aggiunti al sito.

Questo potrebbe essere modificato come una funzione che accetta un array di handle da eliminare o un array di handle da preservare.

$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);
23 nov 2018 20:19:24
0

Ho un metodo molto semplice per eliminare tutti gli eventi cron. Prima di tutto, devi DISABILITARE il WP Cron nel file wp-config Poi, installa il plugin WP Control Successivamente, vai nel menu Strumenti > Eventi Cron > Seleziona tutti > Elimina tutto. Potresti provarlo? Grazie.

27 feb 2019 07:17:33
0

Esegui questo comando dalla CLI, utilizza wp-cli, essenzialmente passa attraverso tutti gli eventi e li elimina uno per uno.

wp cron event list --fields=hook | tail -n +2 | xargs -I {} wp cron event delete {}

31 mag 2024 15:11:29
0

Se cancelli i tuoi task cron in questo modo e utilizzi UpdraftPlus, dovrai ri-salvare le impostazioni per rigenerare i task cron. Fino a quando non lo farai, i tuoi backup automatici non verranno eseguiti (ma i backup manuali funzioneranno).

Le impostazioni rimarranno comunque presenti e non dovrai modificare nulla. Basta andare nel menu principale di [UpdraftPlus]->Impostazioni, scorrere fino in fondo e cliccare su "Salva modifiche".

5 giu 2017 19:06:22
0

Sono arrivato qui a causa dell'enorme quantità di cronjob sm_ping nella tabella wp_options. Se anche tu hai questo problema, potresti provare quanto segue:

Inserisci questo nel file functions.php (del tema child) se non hai accesso a phpmyadmin, specialmente se il tuo sito è appesantito da cronjob di ping (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
    remove_action('do_pings', 'do_all_pings');
    wp_clear_scheduled_hook('do_pings');
}
27 giu 2018 21:52:36