Elimina migliaia di cron job


16

Ho scoperto di avere 29.000 lavori cron nel mio database WordPress da plugin disattivati ​​ed eliminati. Ho provato un numero di plug-in di ottimizzazione, ma l'enorme numero di cron job significa che non riesco a eliminarli utilizzando i plug-in.

Ho anche provato questo nel mio function.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 usare in phpmyadmin per cercare cron hook e rimuoverli?


Ho trovato WP Bulk delete,
usalo

Risposte:


18

Grazie Privateer per la pronta risposta e consigli.

Ho trovato un modo per aggirarlo prima di vedere la tua risposta. Ecco un metodo dettagliato per cancellare migliaia di vecchi lavori cron e può essere utile a qualcun altro.

Ho effettuato l'accesso a phpMyAdmin. Ho fatto clic sul mio database e quindi sulla scheda "Cerca". Ho digitato "cron", quindi ho selezionato "tutte le tabelle" e ho fatto clic su "Vai". Ho scorrere verso il basso l'elenco dei risultati della ricerca fino alla mia tabella wp_options. Ho fatto clic su "Sfoglia". In cima all'elenco c'era option_name 'cron'. Ho fatto clic su "Modifica", quindi ho aspettato che la pagina si caricasse. Ho cliccato sulla casella che mostrava l'elenco dei lavori cron. L'elenco cron era così lungo che ci sono voluti circa 80 secondi perché il mio 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 mio browser completasse l'eliminazione (Chrome è scaduto, quindi ho provato Firefox che ha funzionato).

Dopo un altro paio di minuti, i lavori cron per i miei attuali plugin attivi hanno ripopolato l'elenco. Ci sono stati 9 lavori cron (in calo da oltre 29.000!). Sei anni di duplicati di cron job da plugin mal codificati, alcuni dei quali ho appena installato per un giorno per provare. Inoltre, centinaia di plugin comuni come Wordfence, BackupBuddy, Nextgen Gallery e AutoOptimizer, tutti disinstallati in passato. Il mio sito ora si carica come se fosse stato caricato turbo. L'area di amministrazione è molto più veloce. Gli errori di timeout dell'amministratore sono scomparsi. Ho trascorso così tanto tempo a ottimizzare il mio sito Web cercando di ridurre i tempi di caricamento. Ho persino spostato gli host e aggiornato i miei piani di hosting. Niente ha aumentato la velocità del mio sito come eliminare tutti i lavori cron obsoleti. Il tempo di download da dispositivo mobile è diminuito da 20 secondi a 6 secondi.

Nella mia ricerca di una soluzione ho trovato pochissime informazioni sull'effetto dei lavori cron sulle prestazioni del sito Web. Molti hanno detto che faceva poca differenza e per un numero limitato di cron job è vero. Ma anni nella vita di un sito WordPress mi chiedo quanti siano gonfiati con centinaia se non migliaia di vecchi lavori cron da plugin cancellati. Invece di chiedere agli utenti di controllare il loro limite di memoria php, suggerirei agli sviluppatori di chiedere agli utenti di controllare il numero di cron job in wp_options quando si risolvono problemi di memoria fatale. Potresti essere sorpreso / scioccato da ciò che trovi! :-)


1
Ho trovato lo stesso problema. Non so quanti lavori cron avessi, ma nel database c'erano circa 15 Mb. Dopo l'eliminazione, il tempo di caricamento dell'area di amministrazione è stato ridotto da 5-7 a 0,3 secondi. Il tempo di caricamento del front-end è diminuito da 2 a 0,4 secondi.
Alexey,

1
accidenti! questa soluzione ci ha salvato! aveva 35000 lavori cron in questa tabella. ora sembra turbocompresso come descritto.
Riccardo,

Molto buono da sapere davvero poiché stavo pensando di installare uno dei plugin menzionati per un client. Quindi ora so cosa cercare quando le prestazioni peggiorano lentamente.
lowtechsun,

10

Provare

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', '');

Potrebbe essere necessario eliminare l'opzione cron o impostare il valore su un array serializzato vuoto.

L'uso di update_option sarebbe più sicuro in quanto non sono sicuro se il valore debba essere un array vuoto serializzato o una stringa vuota. Puoi controllare in wp-Includes / options.php però ... ma usando update_option lo gestirai correttamente senza preoccuparti del database.


7

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

wp cron event list
wp cron event delete your_example_event

Maggiori dettagli nei documenti di wp-cli .


3
Oppure cancella tutti gli eventiwp option delete cron
Samuel Elh,

1
wp option delete cronfunziona quando ci sono migliaia di cron job inseriti nelle opzioni. Questi cattivi lavori provengono principalmente da plugin danneggiati, che fanno cron nel modo sbagliato.
Swashata Ghosh,

6

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

Come plug-in a caso singolo (mu) che viene eseguito solo ogni volta che lo attivi:

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

Grazie Kaiser! Per coloro che non si sentono a proprio agio con la creazione / modifica di plugin (è semplice!), Puoi usare ciò che kaiser ha notato nel tuo file Functions.php. Basta aggiungerlo, salvarlo, caricare il sito, quindi rimuoverlo e salvarlo di nuovo.
Privateer,

Che dire dei cron job che sono stati creati all'attivazione del plugin? Questi lavori cron non verranno ricreati fino a quando non disattivi e riattivi il plugin.
alpipego,

Bene, questo non è possibile per impostazione predefinita , né con questo né con le altre domande. Quello che dovresti fare è sia disattivare e riattivare quei plugin (~ 3 minuti di lavoro), o - nel caso tu stia cercando una risposta automatizzata - cercare le funzioni in quei plugin e attivarli dal tuo plugin.
Kaiser

1

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

    $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

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

Imposta un processo cron manuale in cpanel. Ora il mio sito sta letteralmente volando. Avevo aggiornato i server, acquistato più CPU / RAM, ma tutto era uno spreco di tempo e denaro.

Per eliminare tutti i processi cron in sospeso, eseguire questa query in phpmyadmin> Esegui query:

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

Grazie mille Pádraig Ó Beirn.


Prevenuta Preetinder! Sono felice che sia stato di aiuto. Grazie anche per il suggerimento su processi cron in sospeso.
Pádraig Ó Beirn,

0

Se si cancellano le attività cron in questo modo e si utilizza UpdraftPlus, sarà necessario salvare nuovamente le impostazioni per rigenerare le attività cron. Fino a quando non lo fai, i tuoi backup automatici non verranno eseguiti (ma i backup manuali lo faranno).

Le impostazioni saranno ancora presenti e non è necessario modificare nulla. Vai su [menu principale di UpdraftPlus] -> Impostazioni, scorri verso il basso e fai clic su "Salva modifiche".


0

Sono arrivato qui per l'enorme quantità di sm_pingcronjobs dentro wp_options. Se questo è il tuo problema, puoi provare quanto segue:

Metti questo in Functions.php (tema figlio) se non hai accesso a phpmyadmin, specialmente se il tuo sito è gonfio con ping cronjobs (sm_ping):

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

0

Ho riscontrato un problema simile, in cui a causa di uno dei miei errori di codifica, erano state aggiunte a un sito migliaia di copie di un determinato lavoro cron. La funzione wp_clear_scheduled_hook sembrava scadere e fallire. L'ho aggirato con uno script che disinseriva tutte le istanze della funzione cron all'interno dell'array e quindi aggiunge l'array filtrato come nuova opzione cron nella tabella delle opzioni. Vedi sotto.

In questo modo, ho evitato di spazzare via i lavori cron desiderabili precedentemente aggiunti al sito.

Questo potrebbe essere modificato come una funzione che richiede una matrice di handle per eliminare o una matrice 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);

0

Ho un modo molto semplice per eliminare tutti gli eventi cron. Prima, è necessario DISATTIVARE WP Cron in wp-config, quindi installare Plugin WP Control Quindi, passare al menu Strumenti> Eventi cron> Fare clic su Scegli tutto> Elimina tutti. Potresti provarlo. Grazie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.