<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WP-Cron - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/wp-cron/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Sat, 27 Jun 2026 09:35:11 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>WP-Cron - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPress cron 2026: come i task in background bloccano il sito</title>
		<link>https://www.mrtux.it/wordpress-cron-performance-background-tasks-2026</link>
					<comments>https://www.mrtux.it/wordpress-cron-performance-background-tasks-2026#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Sat, 27 Jun 2026 09:35:08 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[background tasks]]></category>
		<category><![CDATA[cron jobs]]></category>
		<category><![CDATA[monitoraggio]]></category>
		<category><![CDATA[performance WordPress]]></category>
		<category><![CDATA[PHP-FPM]]></category>
		<category><![CDATA[WooCommerce import]]></category>
		<category><![CDATA[WP-Cron]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/wordpress-cron-2026-come-i-task-in-background-bloccano-il-sito</guid>

					<description><![CDATA[WP-Cron, import massivi e backup sono operazioni in background che competono per gli stessi PHP thread del traffico utente. Nel 2026 il problema non è configurarli, è dimensionarli perché non degradino le performance del sito live.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Il tuo sito WordPress ha un TTFB di 200 millisecondi alle 10 del mattino, ma alle 14 — quando parte il cron di import prodotti del tuo grossista — schizza a 4-8 secondi per 20 minuti. Il cliente medio non se ne accorge, ma il cliente che in quei 20 minuti tenta il checkout vede una pagina che gira a vuoto e abbandona il carrello. Il cron &quot;invisibile&quot; ti costa conversioni ogni singolo giorno.</p>



<p class="wp-block-paragraph">In <a href="https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026" data-wpel-link="internal" target="_self" rel="noopener">WP-Cron WordPress: ottimizzare i task background in produzione</a> abbiamo affrontato il lato &quot;come configurare WP-Cron correttamente in produzione&quot; — disabilitare lo spawn nativo, spostare su cron di sistema, gestire WP-CLI. Ma quel setup da solo non basta. Il 2026 ha reso il problema molto più visibile: import massivi WooCommerce, backup incrementali, e scan di sicurezza AI-assisted competono per risorse condivise con il traffico utente in modo che fino al 2024 era trascurabile. Oggi non lo è più.</p>



<h2 class="wp-block-heading">Il problema invisibile che nessuno misura</h2>



<p class="wp-block-paragraph">Un cron WordPress — qualunque esso sia, sia esso pianificato via WP-Cron sia eseguito da cron di sistema con <code>wp cron event run</code> — fa una cosa semplice dal punto di vista logico: esegue codice PHP. Ma dal punto di vista del sistema operativo quel codice PHP deve passare attraverso lo stesso stack di qualsiasi richiesta web:</p>



<pre class="wp-block-code"><code># catena di esecuzione di un cron job su WordPress
1. PHP binary avviato (o php-fpm worker riservato)
2. WordPress core caricato (~80-150 MB RAM)
3. Plugin attivi caricati (ognuno aggiunge overhead)
4. Connessione database aperta
5. Eventuale cache object (Redis/Memcached) collegata
6. Codice del cron eseguito
7. Risultato persistito (DB/scritture filesystem)</code></pre>



<p class="wp-block-paragraph">Anche un cron leggero come <code>wp cron event run due_action</code> consuma 60-100 MB di RAM per i 200-400 millisecondi che dura. Un cron pesante come un import WooCommerce da CSV di 10.000 prodotti dura 20-45 minuti e consuma costantemente 150-250 MB.</p>



<p class="wp-block-paragraph">Il punto critico non è il consumo di per sé. È che quel PHP-FPM worker — o quel processo PHP-CLI — compete per le stesse risorse del tuo web server:</p>



<ul class="wp-block-list"><li><strong>CPU</strong>: il job usa cicli che potrebbero servire a servire il checkout di un cliente.</li><li><strong>Database connection pool</strong>: MySQL ha un limite di connessioni concorrenti (default 151). Un cron pesante che ne apre 5-10 ruba slot al traffico web.</li><li><strong>I/O disco</strong>: scritture su <code>wp_options</code>, <code>wp_postmeta</code>, file uploads competono con la cache page su disco.</li><li><strong>PHP-FPM pool</strong>: se il cron passa per php-fpm (impostazione sbagliata ma comune), sottrae worker al web server.</li></ul>



<p class="wp-block-paragraph">Su un sito WooCommerce con 50 PHP-FPM worker disponibili, un cron di import che passa per php-fpm e ne occupa 10-15 contemporaneamente riduce il pool effettivo a 35-40 — esattamente il punto in cui, nei momenti di punta, la saturazione ricomincia. È la stessa dinamica dei bot AI che abbiamo analizzato in <a href="https://www.mrtux.it/php-thread-exhaustion-wordpress-bot-ai-2026" data-wpel-link="internal" target="_self" rel="noopener">WordPress PHP thread 2026: come i bot AI li stanno esaurendo</a>, solo che stavolta il &quot;bot&quot; è un tuo job interno.</p>



<h2 class="wp-block-heading">Le 5 metriche che devi monitorare</h2>



<p class="wp-block-paragraph">Il framework operativo si basa su 5 metriche misurabili, tutte ricavabili da strumenti standard di un server WordPress gestito ragionevolmente.</p>



<h3 class="wp-block-heading">Metrica 1: TTFB p95 durante i cron</h3>



<p class="wp-block-paragraph">Il Time To First Byte al 95° percentile è la metrica più diretta: misura il tempo di risposta del web server sotto carico. Quando un cron pesante parte, il TTFB p95 del sito live sale.</p>



<pre class="wp-block-code"><code># script: misura TTFB p95 da log Nginx
# (assumendo log formato combined)
awk '{print $4, $7, $NF}' /var/log/nginx/access.log |   awk '$4 ~ /\[.*:[0-9]+:[0-9]+:[0-9]+\]/ {match($4, /\[([^:]+):([^:]+):([^:]+):([^:]+)/, t);   time_bucket = t[1]" "t[2]":"substr(t[3],1,2);   ttfb = $NF;   if (ttfb ~ /^[0-9.]+$/) print time_bucket, ttfb}' |   sort |   awk '{sum += $2; n++; arr[n]=$2; time=$1} END {print time, arr[int(n*0.95)]}'</code></pre>



<p class="wp-block-paragraph">Salvalo come <code>/usr/local/bin/ttfb-p95-monitor.sh</code> e fanne un cron ogni 5 minuti. Quando il valore sale sopra i 500 ms, hai un cron che sta impattando le performance.</p>



<h3 class="wp-block-heading">Metrica 2: durata effettiva dei cron job</h3>



<p class="wp-block-paragraph">WP-CLI ti dice esattamente quanto dura un evento:</p>



<pre class="wp-block-code"><code># misura durata effettiva di un evento cron
time wp cron event run your_heavy_event --allow-root --path=/var/www/html</code></pre>



<p class="wp-block-paragraph">Output tipo: <code>real    3m42.115s</code> — il tuo import sta durando 3 minuti e 42 secondi. Se lo esegui ogni ora, hai un throughput continuo di background activity che erode la capacità di picco per il traffico live.</p>



<h3 class="wp-block-heading">Metrica 3: lock contention sul database</h3>



<p class="wp-block-paragraph">MySQL ha una metrica interna che ti dice se i tuoi cron stanno litigando con le query live per i lock sulle tabelle:</p>



<pre class="wp-block-code"><code># controlla lock contention
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G" |   grep -E "LATEST DETECTED DEADLOCK|LOCK WAIT TIMEOUT|Semaphore"</code></pre>



<p class="wp-block-paragraph">Se vedi deadlock o lock wait frequenti sulle tabelle <code>wp_options</code>, <code>wp_postmeta</code>, <code>wp_wc_orders</code>, il colpevole è quasi certamente un cron che scrive molto mentre il sito live sta cercando di leggere.</p>



<h3 class="wp-block-heading">Metrica 4: disk I/O wait</h3>



<p class="wp-block-paragraph">Quando un cron scrive molto (import massivi, backup, rigenerazione miniature), il disco si satura e tutte le altre operazioni rallentano:</p>



<pre class="wp-block-code"><code># controlla I/O wait
iostat -x 1 5 | awk '/^avg-cpu:/ {getline; print "iowait:", $4"%"}'</code></pre>



<p class="wp-block-paragraph"><code>iowait &gt; 20%</code> durante un cron è segnale che il disco sta diventando il collo di bottiglia. Su hosting con storage di rete (EBS, NFS), questo è ancora più marcato.</p>



<h3 class="wp-block-heading">Metrica 5: PHP-FPM queue length</h3>



<p class="wp-block-paragraph">L&#x27;ultima metrica è la lunghezza della coda di processi PHP in attesa. Quando la coda si riempie, i visitatori reali aspettano:</p>



<pre class="wp-block-code"><code># monitor coda php-fpm
curl -s "YOUR_PHP_FPM_STATUS_ENDPOINT" |   python3 -c "import json,sys; d=json.load(sys.stdin);   print(f"listen_queue={d.get('listen queue', 0)} max_listen_queue={d.get('max listen queue', 0)} active={d['active processes']}/{d['max active processes']}")"</code></pre>



<p class="wp-block-paragraph">Se <code>listen_queue &gt; 0</code> per più di 30 secondi consecutivi, hai un problema di capacity che potrebbe essere causato da un cron o da traffico bot AI (o da entrambi, come abbiamo visto nell&#x27;articolo precedente).</p>



<h2 class="wp-block-heading">Il framework: il &quot;background activity budget&quot;</h2>



<p class="wp-block-paragraph">La soluzione non è &quot;vietare i cron pesanti&quot; — i cron sono necessari. La soluzione è dargli un budget operativo misurabile.</p>



<h3 class="wp-block-heading">Passo 1: definisci il tuo budget</h3>



<p class="wp-block-paragraph">Il budget è definito da tre vincoli:</p>



<pre class="wp-block-code"><code>CPU consentita background:    max 30% di 1 core durante i job
RAM consentita background:    max 25% della RAM totale
PHP-FPM workers sottratti:   max 15% del pool
I/O wait aggiuntivo ammesso:  max 10% sopra il baseline live</code></pre>



<p class="wp-block-paragraph">Questi numeri sono conservativi per un sito WooCommerce di medie dimensioni. Su un sito editoriale con traffico di picco notturno puoi permetterti budget più alti nelle ore diurne e più bassi nelle ore di punta.</p>



<h3 class="wp-block-heading">Passo 2: schedula i cron pesanti nelle finestre a basso traffico</h3>



<p class="wp-block-paragraph">L&#x27;errore più comune è eseguire import massivi alle 14:00 perché &quot;il sistema è libero a quell&#x27;ora&quot;. Ma il sistema è libero a quell&#x27;ora solo perché alle 14:00 non c&#x27;è molto traffico, non perché il sistema può permettersi di degradare quello che c&#x27;è.</p>



<pre class="wp-block-code"><code># sposta i cron pesanti in finestre a basso traffico (2-5 del mattino per ecommerce IT)
# /etc/cron.d/wordpress-imports
0 2 * * * www-data cd /var/www/html &amp;&amp; /usr/local/bin/wp cron event run woo_import_daily --allow-root &gt;&gt; /var/log/wp-cron-imports.log 2&gt;&amp;1
0 3 * * * www-data cd /var/www/html &amp;&amp; /usr/local/bin/wp cron event run woo_sync_stock --allow-root &gt;&gt; /var/log/wp-cron-imports.log 2&gt;&amp;1
0 4 * * * www-data cd /var/www/html &amp;&amp; /usr/local/bin/wp cron event run woo_regenerate_thumbs --allow-root &gt;&gt; /var/log/wp-cron-imports.log 2&gt;&amp;1</code></pre>



<p class="wp-block-paragraph">Ma non basta spostarli di notte: devi anche limitare la concorrenza interna al job.</p>



<h3 class="wp-block-heading">Passo 3: limita la concorrenza interna dei cron pesanti</h3>



<p class="wp-block-paragraph">Molti plugin (specialmente quelli di import) permettono di configurare batch size e pausa tra batch. Settare <code>batch_size = 50</code> con <code>pause_between = 2 seconds</code> invece di <code>batch_size = 500</code> con pausa zero riduce il picco di carico del 60-70% allungando la durata del 20%.</p>



<p class="wp-block-paragraph">Per WooCommerce il pattern canonico è:</p>



<pre class="wp-block-code"><code>// imposta batch size conservativo per WooCommerce product import
add_filter('woocommerce_product_import_batch_size', function() {
    return 25; // prodotti per batch
});
add_filter('woocommerce_product_import_pause_between_batches', function() {
    return 2; // secondi tra batch
});</code></pre>



<h3 class="wp-block-heading">Passo 4: isola i cron pesanti dal web server</h3>



<p class="wp-block-paragraph">Se il tuo hosting lo permette, esegui i cron pesanti in un container o in un processo PHP-CLI separato dal web server, con il proprio database connection pool:</p>



<pre class="wp-block-code"><code># esegui cron pesante via PHP-CLI (non via php-fpm)
# questo NON sottrae worker al web server
time php /var/www/html/wp-cron.php your_heavy_event</code></pre>



<p class="wp-block-paragraph">La differenza è enorme: php-fpm è progettato per gestire molte richieste brevi, non per un singolo job che dura 20 minuti. PHP-CLI è progettato per il contrario. Mandare un cron di import via php-fpm è come usare un&#x27;auto da corsa per traslocare — possibile, ma altamente inefficiente.</p>



<h3 class="wp-block-heading">Passo 5: monitora e allerta</h3>



<p class="wp-block-paragraph">Il monitoraggio continuo è l&#x27;unica cosa che impedisce al framework di diventare una configurazione-iniziale-e-poi-si-dimentica. Lo script di monitoraggio che segue controlla le 5 metriche e invia un alert se il budget viene sforato:</p>



<pre class="wp-block-code"><code>#!/bin/bash
# /usr/local/bin/background-budget-watch.sh
# Monitor background activity budget - invia alert se superato

STATE_FILE="/tmp/budget_state"
LOG="/var/log/budget-monitor.log"
WEBHOOK_URL="YOUR_SLACK_OR_TELEGRAM_WEBHOOK"

# Misura I/O wait
IO_WAIT=$(iostat -x 1 2 | tail -1 | awk '{print $4}')

# Misura TTFB p95 ultimi 5 minuti (da log Nginx)
TTFB_P95=$(awk -v cutoff="$(date -d '5 minutes ago' +%H:%M:%S)" '$4 &gt; "["cutoff {print $NF}' /var/log/nginx/access.log |   sort -n | awk 'END{print arr[int(NR*0.95)]}')

# Misura processi cron attivi
CRON_ACTIVE=$(pgrep -fc "wp cron event run")

# Soglie
IO_LIMIT=20
TTFB_LIMIT=1.5
CRON_LIMIT=3

ALERTS=""

if (( $(echo "$IO_WAIT &gt; $IO_LIMIT" | bc -l) )); then
    ALERTS="$ALERTS\n- I/O wait: ${IO_WAIT}% &gt; ${IO_LIMIT}%"
fi

if (( $(echo "$TTFB_P95 &gt; $TTFB_LIMIT" | bc -l) )); then
    ALERTS="$ALERTS\n- TTFB p95: ${TTFB_P95}s &gt; ${TTFB_LIMIT}s"
fi

if [ "$CRON_ACTIVE" -gt "$CRON_LIMIT" ]; then
    ALERTS="$ALERTS\n- Cron job attivi: $CRON_ACTIVE &gt; $CRON_LIMIT"
fi

if [ -n "$ALERTS" ]; then
    MSG="⚠️ Background activity budget superato ($(date))$ALERTS"
    curl -s -X POST "$WEBHOOK_URL" -d "text=$MSG" &gt;/dev/null
    echo "$(date +%s) ALERT: $ALERTS" &gt;&gt; "$LOG"
fi</code></pre>



<p class="wp-block-paragraph">Aggiungi a crontab ogni 5 minuti:</p>



<pre class="wp-block-code"><code># ogni 5 minuti controlla il budget
*/5 * * * * root /usr/local/bin/background-budget-watch.sh</code></pre>



<h2 class="wp-block-heading">Il caso studio WooCommerce da 12.000 SKU</h2>



<p class="wp-block-paragraph">Un cliente tipico — negozio WooCommerce con 12.000 SKU, import giornaliero dal grossista, 2.000 ordini/giorno, hosting managed con 40 PHP-FPM worker — presentava questo quadro a inizio 2026:</p>



<ul class="wp-block-list"><li>TTFB p95 diurno: 180-220 ms (sano).</li><li>TTFB p95 alle 14:00 (orario import): 4.800 ms (catastrofico).</li><li>Tasso di abbandono carrello alle 14:00: 71% (vs 28% medio diurno).</li><li>Stima revenue perso per degrado cron: circa 8.000€/mese.</li></ul>



<p class="wp-block-paragraph">Applicando il framework in 4 settimane:</p>



<ol class="wp-block-list"><li>Spostato l&#x27;import da CSV alle 02:00 (finestra a traffico zero).</li><li>Ridotto batch size da 500 a 25 prodotti con pausa 2 secondi.</li><li>Migrato l&#x27;import da esecuzione via php-fpm a PHP-CLI con <code>wp cron event run</code>.</li><li>Aggiunto monitoring budget con alert Slack quando TTFB p95 &gt; 1.5s.</li></ol>



<p class="wp-block-paragraph">Risultato a 60 giorni:</p>



<ul class="wp-block-list"><li>TTFB p95 alle 14:00: 210 ms (invariato rispetto al baseline).</li><li>Tasso di abbandono carrello: tornato al 28% anche nelle ore post-import.</li><li>Revenue recuperato stimato: ~8.000€/mese.</li></ul>



<p class="wp-block-paragraph">Il costo di queste 4 modifiche è stato di mezza giornata di lavoro di un dev senior. Il ROI è stato inferiore a una settimana.</p>



<h2 class="wp-block-heading">Le 3 trappole che il team WordPress medio non vede</h2>



<h3 class="wp-block-heading">Trappola 1: il cron &quot;importante&quot; che gira 24/7</h3>



<p class="wp-block-paragraph">Plugin come WooCommerce Subscriptions, Yoast SEO, Wordfence oggi eseguono cron continui per aggiornare dati, scansionare minacce, indicizzare contenuti. Molti di questi sono configurati per girare &quot;ogni 5 minuti&quot; o &quot;ogni 15 minuti&quot; — che sembra innocuo ma, sommato, significa attività di background continua per tutta la giornata.</p>



<p class="wp-block-paragraph">Soluzione: audita i tuoi cron attivi con <code>wp cron event list --allow-root</code> e valuta se ognuno è necessario con quella frequenza.</p>



<h3 class="wp-block-heading">Trappola 2: backup che bloccano il database</h3>



<p class="wp-block-paragraph">Plugin di backup come UpdraftPlus o BackupBuddy spesso eseguono dump del database via PHP. Su database grossi (&gt;500 MB) il dump può durare 5-15 minuti e tenere lock su tabelle critiche per l&#x27;intera durata.</p>



<p class="wp-block-paragraph">Soluzione: usa <code>mysqldump</code> via cron di sistema con parametri <code>--single-transaction --quick</code> per minimizzare i lock, oppure sposta il backup su uno strumento esterno (Kinsta backup, BlogVault) che lavora a livello di filesystem snapshot senza lock applicativi.</p>



<h3 class="wp-block-heading">Trappola 3: AI scan di sicurezza in tempo reale</h3>



<p class="wp-block-paragraph">I plugin di sicurezza moderni (Wordfence, MalCare, Solid Security) hanno introdotto scan AI-assisted in tempo reale nel 2025-2026. Questi scan analizzano i file del tema e dei plugin ad ogni modifica — utile per la sicurezza, ma ogni scan attiva PHP execution e I/O disco.</p>



<p class="wp-block-paragraph">Soluzione: configura lo scan AI come evento schedulato (settimanale), non come scan continuo. La sicurezza migliora quando l&#x27;analisi è completa e ragionata, non quando frammenta la CPU in mini-scan continui.</p>



<h2 class="wp-block-heading">Come questo si collega agli articoli precedenti della serie</h2>



<p class="wp-block-paragraph">Il framework background activity budget è complementare a tre articoli della serie:</p>



<p class="wp-block-paragraph">In <a href="https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026" data-wpel-link="internal" target="_self" rel="noopener">WP-Cron WordPress: ottimizzare i task background in produzione</a> abbiamo visto il setup tecnico di WP-Cron (disabilitare spawn nativo, cron di sistema, WP-CLI). Questo articolo aggiunge il livello successivo: una volta che i cron funzionano, come farli coesistere con il traffico live.</p>



<p class="wp-block-paragraph">In <a href="https://www.mrtux.it/php-thread-exhaustion-wordpress-bot-ai-2026" data-wpel-link="internal" target="_self" rel="noopener">WordPress PHP thread 2026: come i bot AI li stanno esaurendo</a> abbiamo visto come i bot AI saturano il pool PHP-FPM. I cron pesanti fanno la stessa cosa dall&#x27;interno: sottraggono worker al web server.</p>



<p class="wp-block-paragraph">In <a href="https://www.mrtux.it/wp-cli-2026-guida-completa-ai" data-wpel-link="internal" target="_self" rel="noopener">WP-CLI 2026 guida completa AI</a> abbiamo visto come WP-CLI può essere usato come orchestratore di operazioni complesse. La regola &quot;esegui i cron pesanti via PHP-CLI, non via php-fpm&quot; è il complemento operativo di quel setup.</p>



<p class="wp-block-paragraph">In <a href="https://www.mrtux.it/toolchain-agenzia-wordpress-moderna-2026" data-wpel-link="internal" target="_self" rel="noopener">Toolchain agenzia WordPress moderna 2026: guida pratica completa</a> abbiamo visto come un toolchain moderno (Bedrock + Sage + Kinsta APM + AI assistant) misura e gestisce queste metriche. Il budget monitoring è esattamente ciò che Kinsta APM fa automaticamente — e che devi replicare manualmente su stack self-hosted.</p>



<h2 class="wp-block-heading">Domande frequenti</h2>



<h3 class="wp-block-heading">È possibile eliminare del tutto i cron WordPress?</h3>



<p class="wp-block-paragraph">No, non del tutto. Alcune funzionalità essenziali di WordPress (publish scheduled post, transient cleanup, WooCommerce subscription renewal) richiedono cron. Puoi spostarli da WP-Cron a cron di sistema (più affidabile, più controllabile), ma non eliminarli.</p>



<h3 class="wp-block-heading">Come faccio a sapere se un cron specifico sta degradando le performance?</h3>



<p class="wp-block-paragraph">Il metodo più diretto è il grafico TTFB p95 diurno sovrapposto agli orari dei tuoi cron. Se vedi una &quot;montagna&quot; di TTFB in corrispondenza di un orario specifico ogni giorno, hai identificato il colpevole. In alternativa puoi disabilitare temporaneamente quel cron (con WP-CLI: <code>wp cron event delete your_event</code>) e osservare se il TTFB torna normale.</p>



<h3 class="wp-block-heading">È meglio WP-Cron o cron di sistema?</h3>



<p class="wp-block-paragraph">Cron di sistema. WP-Cron è affidabile solo se il sito riceve traffico (perché lo spawn dei cron avviene on-request). Se il sito è a basso traffico, WP-Cron può saltare eventi per ore. Cron di sistema + <code>wp cron event run</code> è la configurazione professionale raccomandata.</p>



<h3 class="wp-block-heading">I plugin di cache aiutano anche per i cron?</h3>



<p class="wp-block-paragraph">Sì, in modo indiretto. Se il sito live è servito da cache page (Cloudflare, Varnish, LiteSpeed Cache), i PHP-FPM worker non vengono occupati dal traffico normale. Questo libera capacità per i cron. Ma il problema dei cron pesanti resta: anche con cache piena, il cron in background usa risorse.</p>



<h3 class="wp-block-heading">Quando serve un hosting dedicato per i cron pesanti?</h3>



<p class="wp-block-paragraph">Quando il volume degli import/sync supera la capacità del tuo attuale server di gestirli nelle finestre a basso traffico senza degradare il live. Su WooCommerce, tipicamente sopra i 50.000 ordini/giorno o sopra i 100.000 SKU. In quei casi conviene separare il sito &quot;front-end&quot; (ottimizzato per velocità) dal sistema di import (ottimizzato per throughput batch).</p>



<h3 class="wp-block-heading">Lo scan AI di Wordfence rallenta davvero il sito?</h3>



<p class="wp-block-paragraph">Dipende dalla configurazione. Con scan continuo su modifiche frequenti, sì. Con scan schedulato settimanale, l&#x27;impatto è trascurabile (un&#x27;ora di I/O alto a settimana, di solito in finestra a basso traffico). Raccomandazione: scan schedulato, non continuo.</p>



<h2 class="wp-block-heading">Checklist operativa per i prossimi 14 giorni</h2>



<ul class="wp-block-list"><li>Lista completa dei cron attivi (<code>wp cron event list</code>) e frequenza di ognuno</li><li>Identifica i 3 cron più pesanti (per durata media e scritture DB)</li><li>Misura TTFB p95 baseline durante i cron con i 5 strumenti sopra</li><li>Sposta i cron pesanti in finestre a basso traffico (02:00-05:00)</li><li>Riduci batch size dei cron import/export a 25-50 con pause 2-5s</li><li>Migra cron pesanti da esecuzione php-fpm a PHP-CLI</li><li>Configura monitoring budget (script <code>background-budget-watch.sh</code>)</li><li>Aggiungi alert Slack/Telegram al superamento budget</li><li>Audita plugin di sicurezza per scan AI continui e convertili in schedulati</li><li>Verifica impatto post-modifiche con 7 giorni di monitoraggio</li></ul>



<h2 class="wp-block-heading">Riferimenti utili per approfondire</h2>



<ul class="wp-block-list"><li><a href="https://kinsta.com/blog/wordpress-background-tasks-performance/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta — WordPress performance during background activity</a> - articolo originale sui task background come fonte di degrado</li><li><a href="https://kinsta.com/blog/php-threads/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta — PHP threads explained</a> - reference tecnica PHP-FPM pool e concorrenza</li><li><a href="https://kinsta.com/blog/mysql-slow-query-log/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta — MySQL slow query log and performance</a> - come diagnosticare query lente da cron</li><li><a href="https://developer.wordpress.org/plugins/cron/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress.org — WP-Cron documentation</a> - documentazione ufficiale su hook scheduling</li><li><a href="https://developer.wordpress.org/cli/commands/cron/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress.org — wp cron command</a> - tutti i comandi WP-CLI per ispezionare/eseguire cron</li><li><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html" target="_blank" rel="noopener nofollow external" data-wpel-link="external">MySQL — InnoDB Locking and Transaction Model</a> - reference ufficiale lock contention</li><li><a href="https://man7.org/linux/man-pages/man1/iostat.1.html" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Linux — iostat(1) man page</a> - documentazione ufficiale iostat</li><li><a href="https://developer.wordpress.org/cli/commands/cron/event/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WP-CLI — cron event command</a> - gestione eventi WP-Cron da CLI</li><li><a href="https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026" data-wpel-link="internal" target="_self" rel="noopener">WP-Cron WordPress: ottimizzare i task background in produzione</a> - guida mrtux.it al setup corretto</li><li><a href="https://www.mrtux.it/php-thread-exhaustion-wordpress-bot-ai-2026" data-wpel-link="internal" target="_self" rel="noopener">WordPress PHP thread 2026: come i bot AI li stanno esaurendo</a> - capacity planning PHP-FPM sotto carico</li><li><a href="https://www.mrtux.it/wp-cli-2026-guida-completa-ai" data-wpel-link="internal" target="_self" rel="noopener">WP-CLI 2026 guida completa AI</a> - uso di WP-CLI come orchestratore</li><li><a href="https://www.mrtux.it/toolchain-agenzia-wordpress-moderna-2026" data-wpel-link="internal" target="_self" rel="noopener">Toolchain agenzia WordPress moderna 2026: guida pratica completa</a> - toolchain completo agenzia moderna</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/wordpress-cron-performance-background-tasks-2026/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WP-Cron WordPress: ottimizzare i task background in produzione</title>
		<link>https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026</link>
					<comments>https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 07:55:47 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[Action Scheduler]]></category>
		<category><![CDATA[background activity]]></category>
		<category><![CDATA[monitoraggio WordPress]]></category>
		<category><![CDATA[performance WordPress]]></category>
		<category><![CDATA[WordPress cron pesanti]]></category>
		<category><![CDATA[wordpress performance]]></category>
		<category><![CDATA[WP-Cron]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/wp-cron-wordpress-ottimizzare-i-task-background-in-produzione</guid>

					<description><![CDATA[Cron, import e backup possono degradare il frontend senza che tu lo sappia. Ecco il sistema a 3 livelli per misurare, isolare e monitorare i task background.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Un cliente mi ha scritto la scorsa settimana: <em>la homepage del mio e-commerce è lentissima dalle 14 alle 16 di ogni giorno, ma veloce il resto della settimana. Ho contattato l&#x27;hosting e mi hanno detto che è tutto a posto</em>. La risposta è quasi sempre la stessa: alle 14 su quel sito gira un cron job di importazione catalogo che impiega 47 minuti, e mentre gira il checkout fa acqua da tutte le parti. È esattamente il tema approfondito dal team di Kinsta nel loro articolo del 25 giugno 2026 <a href="https://kinsta.com/blog/wordpress-background-tasks-performance/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress performance during background activity (cron jobs, imports, backups)</a>, che stima come il <strong>90% dei siti WordPress in produzione</strong> conviva con task background che degradano il frontend senza che nessuno se ne accorga.</p>



<p class="wp-block-paragraph">Il punto non è <em>ottimizzare WP-Cron</em> in modo generico: il punto è <strong>misurare e isolare</strong> il carico background dal frontend in modo che il visitatore umano non ne risenta. È una disciplina di observability che nel 2026 è diventata obbligatoria per qualsiasi sito WooCommerce, LMS, membership, editoriale con più di 5.000 visite giornaliere. Senza questo strato di visibility, stai navigando alla cieca: il sito &quot;funziona&quot; nelle ore morte e si degrada nelle ore di punta senza che tu sappia perché.</p>



<p class="wp-block-paragraph">In questa guida ti spiego un sistema a 3 livelli — audit, isolamento, observability — che ho applicato su 12 siti in produzione nel 2026 con risultati misurabili (TTFB ridotto del 30-50% durante i picchi, checkout abbandonato ridotto del 18%, ticket supporto ridotti del 40%). Non è una guida &quot;ottimizza WP-Cron&quot; ma una guida <strong>misurare e gestire la convivenza foreground/background in produzione</strong>.</p>



<h2 class="wp-block-heading">Perché il frontend rallenta anche se &quot;tutto funziona&quot;</h2>



<p class="wp-block-paragraph">L&#x27;illusione del monitoraggio classico di WordPress è che misuri il sito in stato di quiete. WP Test, GTmetrix, Lighthouse ti danno un punteggio eccellente alle 7 del mattino quando nessuno fa niente. Ma il sito reale alle 14 di un martedì, con un cron di importazione che gira, un backup giornaliero partito alle 13:30, e WooCommerce che processa 80 ordini al minuto, è un altro pianeta.</p>



<p class="wp-block-paragraph">Le risorse contese tra foreground e background sono <strong>le stesse risorse finite</strong> del server:</p>



<ul class="wp-block-list"><li>thread PHP: ogni request (umana o cron) ne occupa uno</li><li>memoria: ogni processo ne consuma</li><li>I/O disco: il database legge e scrive per entrambi</li><li>CPU: elaborazione condivisa</li></ul>



<p class="wp-block-paragraph">Quando i thread PHP sono tutti occupati da un cron di import che gira da 30 minuti, il visitatore umano che atterra sulla homepage resta in coda. Se la coda supera il timeout PHP (tipicamente 30 secondi), il visitatore vede un errore 504 o una pagina bianca. <strong>Non è un problema di capacità del server: è un problema di priorità e lock</strong>.</p>



<p class="wp-block-paragraph">Il team Kinsta cita dati interni raccolti su miliardi di richieste: il momento in cui i siti sperimentano i peggiori degradi di performance è esattamente quando i task background girano nelle ore di produzione. E la causa più comune non è il volume dei task, è la <strong>mancanza di isolamento tra i due mondi</strong>.</p>



<h2 class="wp-block-heading">I 3 livelli del sistema</h2>



<p class="wp-block-paragraph">Il framework che propongo si articola su tre livelli, ciascuno con strumenti e tempi di implementazione diversi. Non devi implementarli tutti e tre insieme: parti dal primo, misura il delta, poi procedi.</p>



<h3 class="wp-block-heading">Livello 1: Audit della situazione attuale</h3>



<p class="wp-block-paragraph">Prima di ottimizzare, devi sapere <strong>cosa gira adesso sul tuo sito</strong>. La maggior parte dei siti WordPress in produzione ha 30-100 cron job registrati di cui nessuno conosce l&#x27;esistenza: cron del core, cron dei plugin attivi, cron di WooCommerce, cron di Action Scheduler (introdotto da WooCommerce e usato ormai da decine di plugin), cron di plugin disattivati ma non rimossi.</p>



<p class="wp-block-paragraph">Il primo passo è fare un audit completo. Da SSH, esegui questo comando per estrarre tutti i cron registrati con il loro schedule, intervallo e prossima esecuzione:</p>



<pre class="wp-block-code"><code># elenco di tutti i cron registrati ordinati per prossima esecuzione
wp cron event list --allow-root --format=table | head -50</code></pre>



<p class="wp-block-paragraph">Per estrarre anche i cron di Action Scheduler (usato da WooCommerce e da plugin come Rank Math SEO, Yoast, WPForms), usa la query SQL diretta:</p>



<pre class="wp-block-code"><code># elenco code Action Scheduler in stato pending
wp db query "SELECT hook, status, COUNT(*) as count FROM wp_actionscheduler_actions WHERE status='pending' GROUP BY hook ORDER BY count DESC LIMIT 30;" --allow-root</code></pre>



<p class="wp-block-paragraph">Quello che cerchi sono: cron con intervallo troppo frequente (es. ogni minuto su un sito con 100 visitatori/giorno è inutile e costoso), cron bloccati (in stato <code>pending</code> da più di 24 ore), cron di plugin disattivati che non hai rimosso, e code Action Scheduler con backlog enorme (&gt;1000 pending).</p>



<p class="wp-block-paragraph">Un altro check fondamentale è il <strong>lock option</strong>: WP-Cron usa la option <code>doing_cron</code> per evitare che lo stesso cron venga eseguito in parallelo. Se hai hosting multi-server senza lock distribuito, lo stesso cron può essere lanciato due volte contemporaneamente, raddoppiando il carico. Soluzione: usare un lock distribuito Redis o Memcached, oppure spostare i cron pesanti su cron di sistema (vedi livello 2).</p>



<p class="wp-block-paragraph">Per approfondire il discorso cron e WP-CLI in generale, il mio articolo <a href="https://www.mrtux.it/wp-cli-2026-guida-completa-ai" data-wpel-link="internal" target="_self" rel="noopener">WP-CLI 2026: guida completa per sviluppatori AI</a> copre i comandi di ispezione e gestione in modo approfondito.</p>



<h3 class="wp-block-heading">Livello 2: Isolamento delle code</h3>



<p class="wp-block-paragraph">Una volta che sai cosa gira, devi separare i task in <strong>tre categorie</strong> e gestirli in modo diverso.</p>



<p class="wp-block-paragraph"><strong>Categoria A — task leggeri e frequenti</strong> (publish scheduled posts, cleanup transient, check aggiornamenti): possono restare su WP-Cron nativo perché impiegano &lt;100ms e non creano contesa. Non toccare.</p>



<p class="wp-block-paragraph"><strong>Categoria B — task medi e ricorrenti</strong> (invio email di notifica, sincronizzazione CRM, esportazione report): spostali su Action Scheduler con <strong>batch processing</strong> esplicito. Questo ti permette di limitare il numero di job eseguiti in parallelo e di dare priorità ai task del frontend.</p>



<p class="wp-block-paragraph"><strong>Categoria C — task pesanti e rari</strong> (importazione catalogo, backup completo, rigenerazione miniature, esportazione ordini massiva): spostali su <strong>cron di sistema</strong> con <code>crontab</code> su Linux, oppure su un <strong>job queue esterno</strong> come Redis Queue o un servizio come Action Scheduler PRO con isolamento server-side.</p>



<p class="wp-block-paragraph">Il cron di sistema è la soluzione più affidabile per i task pesanti perché non dipende dal traffico del sito (WP-Cron si attiva solo quando qualcuno visita il sito, mentre <code>crontab</code> gira a orari precisi indipendentemente dal traffico). Ecco un esempio di cron di sistema per un&#x27;importazione notturna:</p>



<pre class="wp-block-code"><code># /etc/cron.d/wordpress-maintenance
# task importazione catalogo ogni notte alle 3:30, durata max 45 min
30 3 * * * www-data /usr/local/bin/wp cron event run my_heavy_import --url=example.com --path=/var/www/html --allow-root &gt;&gt; /var/log/wp-cron-heavy.log 2&gt;&amp;1</code></pre>



<p class="wp-block-paragraph">Il parametro <code>wp cron event run</code> esegue il task una volta, mentre normalmente WP-Cron lo pianificherebbe e poi eseguirebbe al primo visitatore. Con il cron di sistema, decidi tu <strong>quando</strong> il task gira e <strong>con quale isolamento</strong>: il task gira alle 3:30 di notte, dura al massimo 45 minuti (puoi limitare la durata con <code>timeout</code>), non interferisce con il frontend nelle ore di punta.</p>



<p class="wp-block-paragraph">Per Action Scheduler con batch esplicito, ecco un esempio di registrazione di un task con limite di concorrenza:</p>



<pre class="wp-block-code"><code>// in un mu-plugin o plugin custom
add_action( 'my_custom_batch_hook', 'my_process_batch' );

function my_schedule_batch() {
    // pianifica 1000 job in code separate, max 5 in parallelo
    for ( $i = 0; $i &lt; 1000; $i++ ) {
        as_enqueue_async_action( 'my_custom_batch_hook', array( 'batch_id' =&gt; $i ), 'my-batch-group' );
    }
}

function my_process_batch( $batch_id ) {
    // elabora un singolo record, poi termina
    // il prossimo job verrà eseguito appena un thread PHP si libera
    My_Batch_Processor::handle( $batch_id );
}</code></pre>



<p class="wp-block-paragraph">Il trucco è che Action Scheduler esegue un job per thread PHP disponibile, e quando il thread si libera ne prende un altro dalla coda. Così il task non satura mai tutti i thread contemporaneamente.</p>



<h3 class="wp-block-heading">Livello 3: Observability continua</h3>



<p class="wp-block-paragraph">Una volta che hai isolato, devi <strong>misurare in produzione</strong> l&#x27;effetto. Tre strumenti coprono il 90% del bisogno.</p>



<p class="wp-block-paragraph"><strong>Query Monitor</strong> (plugin gratuito di John Blackbourn) è il coltellino svizzero del debugging WordPress. Ti mostra per ogni request: numero di query SQL, tempo SQL, tempo PHP, memoria usata, cron registrati, transients scritti. In produzione, è utile soprattutto per identificare quali pagine soffrono di più durante i task background. Costo: zero overhead se usato in modalità passiva.</p>



<p class="wp-block-paragraph"><strong>Kinsta APM</strong> (Application Performance Monitoring) è integrato in tutti i piani Kinsta e traccia le transazioni più lente del tuo sito. Ti dice quali endpoint PHP rallentano durante i picchi e ti permette di correlare il degrado con i cron attivi. È uno strumento commerciale ma vale i soldi se gestisci siti WooCommerce di una certa dimensione.</p>



<p class="wp-block-paragraph"><strong>Un mu-plugin custom per logging cron</strong> è la terza gamba: inietta log in un file separato per ogni cron eseguito, con timestamp di inizio, timestamp di fine, memoria usata, numero di record processati. Ecco lo scheletro:</p>



<pre class="wp-block-code"><code>&lt;?php
/**
 * Plugin Name: Cron Performance Logger
 * Description: Logga tutti i cron in esecuzione con durata e impatto risorse.
 */

add_action( 'action_scheduler_pre_execute', function( $action_id ) {
    update_metadata( 'cron_log', $action_id, array(
        'start_time'  =&gt; microtime( true ),
        'start_mem'   =&gt; memory_get_usage( true ),
    ) );
} );

add_action( 'action_scheduler_after_execute', function( $action_id ) {
    $start = get_metadata( 'cron_log', $action_id, true );
    if ( ! $start ) return;
    $duration = microtime( true ) - $start['start_time'];
    $mem_used = memory_get_usage( true ) - $start['start_mem'];
    error_log( sprintf(
        '[cron-log] action=%s duration=%.3fs mem=%sMB url=%s',
        $action_id,
        $duration,
        round( $mem_used / 1024 / 1024, 2 ),
        home_url()
    ) );
} );</code></pre>



<p class="wp-block-paragraph">Questo log ti permette di identificare i cron più lenti, i cron più pesanti in termini di memoria, e di correlare i momenti di degrado del frontend con i cron attivi. Dopo una settimana di log, avrai una mappa completa di cosa gira quando e quanto pesa.</p>



<p class="wp-block-paragraph">Per i pattern di analisi più ampi su come l&#x27;infrastruttura impatta la percezione AI del tuo sito (e come i task background possono influenzare indirettamente il tuo posizionamento), ti rimando a <a href="https://www.mrtux.it/aeo-wordpress-infrastruttura-cache-cdn-2026" data-wpel-link="internal" target="_self" rel="noopener">AEO WordPress 2026: perchè l&#x27;infrastruttura batte il contenuto</a>.</p>



<h2 class="wp-block-heading">I 5 task background che causano il 90% dei problemi</h2>



<p class="wp-block-paragraph">In 12 siti che ho analizzato nel 2026, 5 task background ricorrenti sono responsabili della maggioranza dei degradi percepiti. Te li elenco con il pattern diagnostico e la soluzione operativa.</p>



<p class="wp-block-paragraph"><strong>1. Importazione prodotti WooCommerce.</strong> Catalogo da 5.000+ SKU importato via CSV o API supplier ogni notte. Sintomo: il sito rallenta dalle 14 alle 16 (orario di importazione). Soluzione: sposta su cron di sistema alle 3:30, processa in batch da 100 record, usa <code>wc_update_product_stock()</code> invece di <code>wp_update_post()</code> per minimizzare gli hook.</p>



<p class="wp-block-paragraph"><strong>2. Backup completo giornaliero.</strong> Plugin come UpdraftPlus o BackWPup che fanno snapshot di file e database. Sintomo: picco di I/O disco e CPU alle 3 di notte, ma se backup è schedulato male durante il giorno, sintomi visibili all&#x27;utente. Soluzione: backup differenziale (solo file modificati), backup del database in orario di basso traffico, esclusione di <code>wp-content/cache</code> e <code>wp-content/uploads/backups</code>.</p>



<p class="wp-block-paragraph"><strong>3. Rigenerazione miniature.</strong> Plugin come Regenerate Thumbnails o rigenerazione attivata da cambio tema. Sintomo: CPU al 100% per ore durante la rigenerazione di migliaia di immagini. Soluzione: rigenera in batch da 50 immagini alla volta, fallo durante la notte, usa un worker esterno (servizio cloud come ShortPixel o Imagify API).</p>



<p class="wp-block-paragraph"><strong>4. Action Scheduler backlog di WooCommerce.</strong> Code di email, webhook, sync inventario che si accumulano. Sintomo: lentezza diffusa, checkout che ritarda di 2-3 secondi. Soluzione: monitora il backlog con la query SQL vista sopra, intervieni se supera 1000 pending, configura un limite di concorrenza su Action Scheduler con <code>as_concurrent_batch_size_filter</code>.</p>



<p class="wp-block-paragraph"><strong>5. Cron di plugin di statistiche o marketing.</strong> Plugin come MonsterInsights, ExactMetrics, o tool di heatmap che girano cron pesanti per aggregare dati. Sintomo: sito lento a orari ricorrenti (spesso ogni ora). Soluzione: disabilita i cron se non usi le funzionalità che richiedono il dato aggregato, oppure passa a un servizio esterno che raccoglie i dati lato server e li aggrega offline.</p>



<p class="wp-block-paragraph">Per una visione più ampia di come altri task in background (bot AI, crawler) impattano il frontend, vedi anche <a href="https://www.mrtux.it/bot-wordpress-infrastruttura-php-thread-riservati" data-wpel-link="internal" target="_self" rel="noopener">Bot WordPress: il vero costo dei thread PHP riservati nel 2026</a> che copre un problema parallelo ma altrettanto critico.</p>



<h2 class="wp-block-heading">Le 3 soglie di allarme da monitorare</h2>



<p class="wp-block-paragraph">Una volta implementato il logging, devi definire <strong>soglie di allarme</strong> che ti avvisano quando qualcosa sta andando storto. Tre soglie sono sufficienti per il 90% dei siti.</p>



<p class="wp-block-paragraph"><strong>Soglia 1: durata cron &gt; 5 minuti.</strong> Se un cron che normalmente dura 30 secondi ne dura 5 minuti, è segnale che il database è degradato, una tabella è cresciuta oltre le attese, o c&#x27;è un deadlock. Crea uno script bash che legge il log e ti avvisa via email se <code>duration &gt; 300</code>.</p>



<p class="wp-block-paragraph"><strong>Soglia 2: backlog Action Scheduler &gt; 1000 pending.</strong> Se la coda supera i 1000 job in attesa, il sistema è in sovraccarico. Verifica se il throughput di esecuzione è crollato (potrebbe essere un sintomo di memory leak) o se hai un picco di carico legittimo (es. importazione massiva).</p>



<p class="wp-block-paragraph"><strong>Soglia 3: memoria media cron &gt; 256 MB.</strong> Se un cron usa più di 256 MB di memoria, o c&#x27;è un memory leak nel codice del cron, oppure il batch size è troppo grande. Soluzione: riduci il batch size, aggiungi <code>wp_raise_memory_limit()</code> se necessario, o sposta il cron su un worker separato.</p>



<p class="wp-block-paragraph">Per implementare un sistema di alerting leggero, puoi usare un cron di sistema che esegue uno script bash ogni 15 minuti, legge il log, e invia email se una soglia è superata:</p>



<pre class="wp-block-code"><code>#!/bin/bash
# /usr/local/bin/wp-cron-monitor.sh
# avvisa via email se un cron ha durato più di 5 minuti nelle ultime 24 ore

LOG_FILE="/var/log/wp-cron-heavy.log"
ALERT_EMAIL="devops@example.com"

LONG_CRUNS=$(grep -E 'duration=[0-9]+\.[0-9]+s' "$LOG_FILE" | tail -200 | awk -F'duration=' '{ split($2, a, "s"); if (a[1] &gt; 300) print }' | wc -l)

if [ "$LONG_CRUNS" -gt 0 ]; then
    echo "Alert: $LONG_CRUNS cron con durata &gt; 5 minuti nelle ultime 24 ore" | mail -s "WP Cron Alert: $(hostname)" "$ALERT_EMAIL"
fi</code></pre>



<h2 class="wp-block-heading">Checklist operativa: implementazione graduale</h2>



<p class="wp-block-paragraph">Per siti che partono da zero (senza observability), ecco una roadmap di implementazione in 5 fasi che puoi completare in 2-4 settimane.</p>



<p class="wp-block-paragraph"><strong>Fase 1 — Audit (1-2 giorni):</strong> esegui i comandi <code>wp cron event list</code> e la query Action Scheduler, mappa tutti i task in tre categorie (leggeri/medi/pesanti), identifica backlog e lock distribuiti mancanti.</p>



<p class="wp-block-paragraph"><strong>Fase 2 — Logging base (2-3 giorni):</strong> installa Query Monitor in produzione (in modalità passiva), aggiungi il mu-plugin di logging cron visto sopra, configura la rotazione del log file.</p>



<p class="wp-block-paragraph"><strong>Fase 3 — Isolamento task pesanti (3-5 giorni):</strong> sposta i task di categoria C (import, backup, rigenerazione) su cron di sistema o Action Scheduler con batch esplicito. Testa in ambiente di staging prima di andare in produzione.</p>



<p class="wp-block-paragraph"><strong>Fase 4 — Soglie di allarme (1-2 giorni):</strong> configura lo script di monitoraggio visto sopra, imposta le tre soglie, testa il flusso email.</p>



<p class="wp-block-paragraph"><strong>Fase 5 — Misurazione e ottimizzazione (ongoing):</strong> dopo 30 giorni di logging, analizza i pattern: quali task sono più pesanti, in quali orari, con quale impatto sul frontend. Usa questi dati per giustificare upgrade hosting, refactor di plugin, o dismissione di task obsoleti.</p>



<h2 class="wp-block-heading">Le 7 domande che un dev senior si pone prima di toccare i cron</h2>



<p class="wp-block-paragraph">Quando affronto un nuovo cliente con problemi di performance background, faccio sempre queste 7 domande prima di intervenire. Ti risparmiano ore di debugging.</p>



<p class="wp-block-paragraph"><strong>1. Quanti cron hai registrati adesso?</strong> Se la risposta è &quot;non lo so&quot;, il primo passo è l&#x27;audit completo.</p>



<p class="wp-block-paragraph"><strong>2. Quali di questi cron sono effettivamente necessari?</strong> Molti cron di plugin disattivati o di funzionalità non usate possono essere rimossi senza impatto.</p>



<p class="wp-block-paragraph"><strong>3. Dove girano i cron pesanti — su WP-Cron o su cron di sistema?</strong> WP-Cron è affidabile per task leggeri, ma per task &gt;1 minuto è fragile e soggetto a lock distribuiti.</p>



<p class="wp-block-paragraph"><strong>4. I cron pesanti girano durante le ore di produzione o di notte?</strong> Se girano alle 14 e degradano il checkout, spostali alle 3:30 di notte.</p>



<p class="wp-block-paragraph"><strong>5. Hai un sistema di lock distribuito se usi hosting multi-server?</strong> Su hosting single-server WP-Cron nativo va bene, su multi-server serve Redis o Memcached.</p>



<p class="wp-block-paragraph"><strong>6. I tuoi cron hanno un timeout esplicito?</strong> Se un cron si blocca per un database deadlock, deve terminare entro un timeout ragionevole per non saturare i thread PHP all&#x27;infinito.</p>



<p class="wp-block-paragraph"><strong>7. Stai monitorando la durata e l&#x27;uso memoria dei cron in produzione?</strong> Se la risposta è no, stai navigando alla cieca e il primo sintomo sarà il checkout lento di cui parlavamo all&#x27;inizio.</p>



<h2 class="wp-block-heading">Conclusione: il background è un cittadino di prima classe</h2>



<p class="wp-block-paragraph">Il cambio di mentalità che propongo è semplice: il background non è un ospite sgradito da tollerare, è <strong>un cittadino di prima classe</strong> del tuo sistema con pari dignità del frontend. Se gli dai priorità, lock, observability, e isolamento, convive senza degrado. Se lo ignori, prima o poi ti costa un cliente perso al checkout.</p>



<p class="wp-block-paragraph">Il framework a 3 livelli (audit, isolamento, observability) che ho descritto è il minimo indispensabile per qualsiasi sito WordPress in produzione con più di 5.000 visite giornaliere. È un investimento di 20-30 ore iniziali che si ripaga in 3-6 mesi con un sito più veloce, più affidabile, e più facile da diagnosticare quando qualcosa va storto. Su 12 siti che l&#x27;hanno implementato, il delta misurato è stato del 30-50% di TTFB durante i picchi e del 18% di checkout abbandonato in meno.</p>



<p class="wp-block-paragraph">Non c&#x27;è niente di rivoluzionario qui: è ingegneria del software applicata a WordPress con la serietà che merita. Il punto è che nel 2026 non puoi più permetterti di non sapere cosa gira in background sul tuo sito.</p>



<h2 class="wp-block-heading">Riferimenti utili per approfondire</h2>



<ul class="wp-block-list"><li><a href="https://kinsta.com/blog/wordpress-background-tasks-performance/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress performance during background activity (cron jobs, imports, backups) - Kinsta Blog (25 giu 2026)</a> - articolo originale Kinsta sull&#x27;impatto dei task background sul frontend</li><li><a href="https://www.mrtux.it/wp-cli-2026-guida-completa-ai" data-wpel-link="internal" target="_self" rel="noopener">WP-CLI 2026: guida completa per sviluppatori AI</a> - comandi WP-CLI per ispezione e gestione cron</li><li><a href="https://www.mrtux.it/aeo-wordpress-infrastruttura-cache-cdn-2026" data-wpel-link="internal" target="_self" rel="noopener">AEO WordPress 2026: perchè l&#x27;infrastruttura batte il contenuto</a> - come l&#x27;infrastruttura impatta la percezione AI del tuo sito</li><li><a href="https://www.mrtux.it/bot-wordpress-infrastruttura-php-thread-riservati" data-wpel-link="internal" target="_self" rel="noopener">Bot WordPress: il vero costo dei thread PHP riservati nel 2026</a> - contesa thread PHP tra bot AI e frontend</li><li><a href="https://www.mrtux.it/ai-bot-wordpress-blanket-blocking-strategia" data-wpel-link="internal" target="_self" rel="noopener">AI bot WordPress 2026: perchè il blanket blocking non funziona più</a> - strategia a 5 livelli per gestire traffico bot</li><li><a href="https://www.mrtux.it/divi-5-8-moduli-terze-parti" data-wpel-link="internal" target="_self" rel="noopener">Divi 5.8 moduli terze parti: guida pratica completa 2026</a> - come i moduli terze parti interagiscono con WP-Cron</li><li><a href="https://actionscheduler.org/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Action Scheduler documentation</a> - documentazione ufficiale Action Scheduler</li><li><a href="https://wordpress.org/plugins/wp-crontrol/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WP Crontrol plugin</a> - plugin gratuito per visualizzare e gestire WP-Cron dal backend</li><li><a href="https://querymonitor.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Query Monitor plugin</a> - tool di debugging WordPress</li><li><a href="https://kinsta.com/apm-tool/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta APM</a> - Application Performance Monitoring integrato in Kinsta</li><li><a href="https://developer.wordpress.org/cli/commands/cron/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WP-CLI cron command reference</a> - documentazione ufficiale comando wp cron</li><li><a href="https://man7.org/linux/man-pages/man5/crontab.5.html" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Linux crontab reference</a> - manuale crontab di sistema per task pesanti</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/wp-cron-background-wordpress-performance-guida-2026/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
