Dovrei disabilitare WP_CRON e invece attivare wp-cron.php dal server ogni pochi minuti?


12

Sembra che WordPress spari inutilmente WP CRON ad ogni caricamento della pagina. Sto pensando, invece di averlo eseguito ad ogni visita, perché non programmarlo per eseguirlo ogni 5 minuti tramite server? Potrei semplicemente attivare wp-cron.php ogni cinque minuti e ottenere il risultato desiderato?

C'è qualche aspetto negativo in questo?

Risposte:


15

Non esiste alcun aspetto negativo per l'esecuzione di WP CRON utilizzando i processi cron del server. In realtà questa è la pratica raccomandata.

Secondo il documento ufficiale di sviluppo del plugin WordPress :

WP-Cron non funziona in modo continuo, il che può essere un problema se ci sono attività critiche che devono essere eseguite in tempo. C'è una soluzione semplice per questo. Basta impostare l'utilità di pianificazione del sistema per l'esecuzione sugli intervalli desiderati (o nel momento specifico necessario).

Per fare ciò, devi prima disabilitare il comportamento cron predefinito in wp-config.php:

define('DISABLE_WP_CRON', true);

Quindi, pianificare wp-cron.phpdal proprio server. Per Linux, ciò significa:

crontab -e

Tuttavia, anziché eseguirlo nella riga di comando (CLI), eseguirlo come richiesta HTTP. Per questo puoi usare wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress carica tutti i file core richiesti, i plugin ecc. wp-cron.phpCon il seguente CODICE:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Quindi non preoccuparti che WordPress non carichi funzionalità importanti.


1
La documentazione di WordPress.org che hai collegato a menzioni wget http://YOUR_SITE_URL/wp-cron.phpsenza l'aggiunta di ?doing_wp_cron Quindi una è migliore dell'altra? A cosa serve l'aggiunta della ?doing_wp_cronnon versione?
Garconis,

Probabilmente solo così i tuoi registri mostreranno la stringa di query in modo da sapere come è stata chiamata con certezza.
Slbox

1
Non sono affatto d'accordo. Prima di tutto, non è vero che è "raccomandato". In secondo luogo, questo metodo paralizzerà tutti i plug-in che utilizzano l'attuale metodo consigliato di pianificazione degli eventi. Penso che questo sia davvero un cattivo consiglio. Quasi nessuno dovrebbe spegnere il cron a meno che tu non abbia un motivo MOLTO specifico per farlo. L'unica ragione che mi viene in mente è se stai rompendo WordPress per una CDN o qualcosa del genere. Questa NON è una pratica normale.
John Dee,

1
@JohnDee: questo metodo in realtà non disabilita cron, disabilita il metodo WP Cron che controlla e tenta di eseguire lavori cron su ogni caricamento della pagina. define('DISABLE_WP_CRON', true);disabilita solo quella parte del processo cron e quindi chiama lo script cron con codice come: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronsul server si assicura che i processi cron vengano eseguiti. Qualsiasi plug-in di pianificazione non conoscerà nemmeno la differenza.
Fayaz,

1
Link alla documentazione di WordPress.org su questo argomento modificato in developer.wordpress.org/plugins/cron/…
aldemarcalazans

2

Ci sono un paio di aspetti negativi: in primo luogo, quando si utilizza wp-cron.php come cli non vengono impostate cose come le variabili $ _SERVER. Le persone superano questa limitazione usando invece una richiesta curl a wp-cron.php.

In secondo luogo, poiché lo stesso WP non è caricato con wp-cron.php; se si utilizza un plug-in mailer SMTP, questo non verrà caricato quando si chiama wp-cron. Ancora una volta, l'uso di una chiamata a ricciolo ha la precedenza su questo problema. Il ricciolo sembra essere il metodo più frequentemente usato.

Tuttavia; Preferisco usare wp-cli dopo aver impostato correttamente le impostazioni di posta in postfix e (per nginx) php-fpm e aver impostato un crontab come

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Elenca tutti i croni con campi specifici in formato csv - hook essendo il nome del cron, il tempo relativo alla prossima corsa è il tempo. Rimuovi quelli che mostrano 'adesso' come prossima corsa (quelli che dovrebbero essere ora) usando AWK, passa quella lista a xargs a chiama wp cron event run $HOOKogni cron.) Usando wp-cli carica correttamente WordPress (ho scelto di saltare i plugin quando elencavo i croni, poiché errori di codice e avvisi php rovinerebbero l'output dello script; ma non saltarli quando esegui cron con xargs, come il cron potrebbe aver bisogno di caricare i plugin)

Spero che questo ti dia alcuni consigli su cosa cercare.


2
Come sulla configurazione: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron come suggerito da TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Sembra fare bene il lavoro. Gradirei il tuo commento.
TheBigK,

Sì, come ho già detto in tutto il mondo, le persone scelgono di usare curl (wget o qualsiasi altra chiamata http) per attivare i croni, e non c'è niente di sbagliato in questo metodo. Stavo solo avvisando i problemi di chiamare direttamente il file php wp-cron, che non includeva i file richiesti, e consigliando un altro metodo alternativo se volessi renderlo un po 'più piccante.
TechnicalChaos

0

Ci sono molti motivi per non disabilitare wp-cron. In effetti, è quasi impossibile trovare un caso d'uso per farlo. Non rallenta il tuo sito e viene utilizzato per cose di cui potresti non essere a conoscenza.

Molti plugin usano WP-Cron per pianificare le cose. Potrebbero diventare confusi se si spegne lo scheduler.

C'è una proliferazione di tutorial su questo argomento perché è confuso e perché non fa molto al tuo sito quando lo disabiliti. Quello che farà è causare mal di testa allo sviluppatore che deve risolvere il misterioso problema che crea in sei mesi.

Inoltre, il battito cardiaco del WP si attiva ogni 15 secondi nell'area di amministrazione, risolvendo questo problema per il 99% delle persone che pensano di averlo.


2
Questa è una risposta terribile - NON stanno disabilitando WP Cron. Stanno semplicemente disabilitando l'invocazione di WP Cron su pageload e scaricandola invece sul demone cron di sistema. Sheesh.
Barry Chapman,

Ad ogni modo, il motivo principale per lasciarlo in pace è che molti plugin stanno usando il cron per eseguire attività in background estese. Puoi sbagliare qualcosa che la persona SUCCESSIVA sta facendo, perché si aspettano che il sistema funzioni in modo standard. In bocca al lupo!
John Dee,

se un plugin è codificato in un modo che si interrompe totalmente se wp cron è disabilitato, significa che è stato programmato da un incompetente ed è meglio disinstallarlo immediatamente.
Magnetic_dud,

Bene, i due commenti qui dimostrano il mio punto. Hai uno sviluppatore che dice "questo non disabilita cron ma lo mescola debolmente a cron OS" - che è una rottura in WordPress, che è neutrale del sistema operativo. Quindi un altro sviluppatore dice "hey, è responsabilità del plugin sviluppatore pianificare l'annullamento di wp cron". Ok Quindi, se si desidera la funzionalità cron, è necessario pianificare per l'eliminazione del sistema cron? A cosa? Il sistema cron di backup? Questo commento non ha senso [ovviamente].
John Dee,

Ad ogni modo, lo stato attuale è "TOTAL CONFUSION". Questo è lo stato attuale. L'unica soluzione, da un POV di cornici, è dire alle persone: ESISTE UN MOTIVO CHE ESISTE IL SISTEMA WP-CRON. NON SPEGNERE. L'altra opzione è di 10.000 opinioni diverse e varie. Questo è quello che abbiamo ora.
John Dee,

0

Devo ancora trovare un vero svantaggio di scaricare wp-cron su un servizio esterno. Lo sto facendo da molti anni.

Soprattutto nel mondo di oggi in cui è possibile eseguire applicazioni come microservizi.

Uso contenitori Docker separati per ciascun componente WordPress: php, web, db, crontab, redis e così via). Avere crontab come contenitore separato, chiamare wp-cron tramite http utilizzando la rete locale, in esecuzione solo quando ne ho bisogno.

Ciò riduce lo stress sui nodi back-end e migliora la sicurezza avendo una superficie di attacco più piccola.

Se lo sviluppatore non riesce a capire come fare le cose senza dover chiamare wp-cron ad ogni caricamento della pagina, diamine, questo parla solo per inesperienza per suo conto. "Lasciarlo da solo", perché non capisci come funzionano le cose non è una buona ragione per mantenerlo.

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.