{"id":741,"date":"2026-02-20T09:00:00","date_gmt":"2026-02-20T08:00:00","guid":{"rendered":"https:\/\/darioiannascoli.it\/blog\/ottimizzare-php-fpm-opcache-plesk\/"},"modified":"2026-02-18T18:04:18","modified_gmt":"2026-02-18T17:04:18","slug":"ottimizzare-php-fpm-opcache-plesk","status":"publish","type":"post","link":"https:\/\/darioiannascoli.it\/blog\/ottimizzare-php-fpm-opcache-plesk\/","title":{"rendered":"Come Ottimizzo PHP-FPM e OPcache su Plesk per Velocizzare i Siti"},"content":{"rendered":"<p>Se gestisci siti WordPress o applicazioni PHP su un server con <strong>Plesk<\/strong>, c&#8217;\u00e8 una probabilit\u00e0 molto alta che tu stia lasciando sul tavolo una quantit\u00e0 significativa di prestazioni. Lo dico per esperienza diretta: nella mia carriera da sysadmin ho ottimizzato centinaia di server Plesk, e nella stragrande maggioranza dei casi la configurazione di default di <strong>PHP-FPM<\/strong> e <strong>OPcache<\/strong> \u00e8 tristemente inadeguata. I valori predefiniti sono pensati per funzionare ovunque senza errori, non per offrire le migliori prestazioni. Il risultato? Siti WordPress che impiegano 3-5 secondi a caricarsi quando potrebbero farlo in meno di 1 secondo, server che vanno in sofferenza con poche decine di visitatori contemporanei, e risorse hardware pagate profumatamente che rimangono largamente inutilizzate.<\/p>\n<p>In questa guida ti mostro <strong>esattamente come ottimizzo PHP-FPM e OPcache su Plesk<\/strong>, con i valori precisi che uso in produzione sui miei server. Non si tratta di teoria astratta: ti do le configurazioni reali, calcolate in base alla RAM disponibile, il numero di siti ospitati e il tipo di traffico. Vedremo come capire la differenza tra PHP-FPM e mod_php, come configurare il pool PHP-FPM con i valori corretti di <strong>pm.max_children, pm.start_servers, pm.min_spare_servers e pm.max_spare_servers<\/strong>, come abilitare e ottimizzare OPcache con i parametri giusti, come monitorare le prestazioni con la status page di PHP-FPM e come verificare il hit rate di OPcache. Ti mostrer\u00f2 anche i benchmark prima e dopo, misurati con strumenti professionali come <strong>GTmetrix, Apache Bench e curl<\/strong>. Preparati a vedere i tuoi siti volare.<\/p>\n<h2>1. PHP-FPM vs mod_php: Perch\u00e9 PHP-FPM \u00e8 Fondamentale<\/h2>\n<p>Prima di entrare nella configurazione, \u00e8 importante capire <strong>cosa sia PHP-FPM<\/strong> e perch\u00e9 \u00e8 superiore all&#8217;alternativa tradizionale. Questa comprensione ti aiuter\u00e0 a capire il senso di ogni parametro che andremo a configurare.<\/p>\n<p><strong>mod_php<\/strong> \u00e8 il metodo tradizionale per eseguire PHP: il motore PHP viene caricato direttamente dentro il processo di Apache come un modulo. Ogni processo Apache include l&#8217;interprete PHP, anche quando serve file statici come immagini o CSS. Questo significa che <strong>ogni processo Apache consuma la memoria necessaria per PHP<\/strong>, anche quando PHP non serve affatto. Su un server con molte connessioni contemporanee, questo spreco di memoria diventa enorme.<\/p>\n<p><strong>PHP-FPM<\/strong> (FastCGI Process Manager) \u00e8 un&#8217;architettura completamente diversa: PHP gira come un <strong>servizio separato e indipendente<\/strong> dal web server. Apache (o Nginx) riceve le richieste e, solo quando la richiesta riguarda un file PHP, la inoltra a PHP-FPM tramite il protocollo FastCGI. PHP-FPM mantiene un <strong>pool di processi worker<\/strong> pronti a gestire le richieste PHP, riducendo drasticamente il tempo di inizializzazione. I vantaggi sono molteplici:<\/p>\n<ul>\n<li><strong>Migliore gestione della memoria:<\/strong> Solo i processi PHP-FPM consumano la memoria necessaria per PHP. Il web server resta leggero per servire i file statici.<\/li>\n<li><strong>Isolamento tra siti:<\/strong> Su Plesk, ogni dominio pu\u00f2 avere il proprio pool PHP-FPM con le proprie risorse dedicate. Un sito sovraccarico non influenza gli altri.<\/li>\n<li><strong>Gestione avanzata dei processi:<\/strong> PHP-FPM offre modalit\u00e0 di gestione dei processi (static, dynamic, ondemand) che permettono di ottimizzare l&#8217;uso delle risorse in base al traffico effettivo.<\/li>\n<li><strong>Compatibilit\u00e0 con Nginx:<\/strong> PHP-FPM funziona nativamente sia con Apache che con Nginx, e Plesk supporta entrambi. Se usi Nginx come reverse proxy davanti ad Apache (la configurazione predefinita di Plesk), PHP-FPM \u00e8 essenziale per ottenere il massimo delle prestazioni.<\/li>\n<li><strong>Status page:<\/strong> PHP-FPM offre una pagina di stato in tempo reale che mostra quanti processi sono attivi, quante richieste sono in coda, e la memoria utilizzata. Uno strumento diagnostico preziosissimo.<\/li>\n<\/ul>\n<p>Su Plesk, PHP-FPM \u00e8 la <strong>modalit\u00e0 consigliata e predefinita<\/strong> per le installazioni moderne. Se per qualche motivo il tuo server sta ancora usando mod_php o CGI, il primo passo \u00e8 migrare a PHP-FPM. Per verificarlo, vai in <strong>Plesk \u2192 Domains \u2192 il tuo dominio \u2192 Impostazioni PHP<\/strong> e controlla che la voce &#8220;Esegui PHP come&#8221; sia impostata su <strong>&#8220;Applicazione FPM gestita dal server web&#8221;<\/strong> (oppure <strong>&#8220;FPM application served by Apache&#8221;<\/strong> \/ <strong>&#8220;FPM application served by Nginx&#8221;<\/strong> a seconda della tua configurazione).<\/p>\n<h2>2. Configurare il Pool PHP-FPM su Plesk: I Parametri Chiave<\/h2>\n<p>Questa \u00e8 la parte pi\u00f9 importante e quella dove la maggior parte degli amministratori sbaglia. Il <strong>pool PHP-FPM<\/strong> \u00e8 l&#8217;insieme di processi worker che gestiscono le richieste PHP. La configurazione di default di Plesk \u00e8 troppo conservativa: pochi processi attivi, che vanno in sofferenza rapidamente sotto carico. Vediamo come configurarli correttamente.<\/p>\n<p>I parametri fondamentali sono quattro, e sono tutti legati tra loro:<\/p>\n<ol>\n<li><strong>pm (Process Manager):<\/strong> La modalit\u00e0 di gestione dei processi. Le opzioni sono:\n<ul>\n<li><strong>static:<\/strong> Mantiene sempre un numero fisso di processi. Usa pi\u00f9 memoria ma offre le migliori prestazioni perch\u00e9 non c&#8217;\u00e8 overhead di creazione\/distruzione dei processi. <strong>Consigliato per server dedicati con traffico costante.<\/strong><\/li>\n<li><strong>dynamic:<\/strong> Adatta il numero di processi in base al traffico. \u00c8 la scelta pi\u00f9 comune e quella che consiglio nella maggior parte dei casi. I processi vengono creati e distrutti in base alla domanda, entro i limiti che configuriamo.<\/li>\n<li><strong>ondemand:<\/strong> Crea i processi solo quando arriva una richiesta e li distrugge dopo un timeout di inattivit\u00e0. Usa meno memoria ma ha un leggero ritardo sulla prima richiesta. <strong>Consigliato per VPS con poca RAM o siti a basso traffico.<\/strong><\/li>\n<\/ul>\n<\/li>\n<li><strong>pm.max_children:<\/strong> Il numero massimo di processi PHP che possono essere attivi contemporaneamente. Questo \u00e8 il parametro pi\u00f9 critico. Se il valore \u00e8 troppo basso, le richieste vengono messe in coda e il sito rallenta. Se \u00e8 troppo alto, il server esaurisce la RAM e inizia a usare lo swap, peggiorando le prestazioni di tutto.<\/li>\n<li><strong>pm.start_servers:<\/strong> Il numero di processi avviati all&#8217;avvio del pool (solo con pm = dynamic). Deve essere un valore compreso tra min_spare_servers e max_spare_servers.<\/li>\n<li><strong>pm.min_spare_servers:<\/strong> Il numero minimo di processi inattivi (in standby) sempre pronti. Se scende sotto questo valore, PHP-FPM ne crea di nuovi.<\/li>\n<li><strong>pm.max_spare_servers:<\/strong> Il numero massimo di processi inattivi. Se ce ne sono troppi in standby, PHP-FPM ne termina alcuni per risparmiare memoria.<\/li>\n<\/ol>\n<p><strong>Come calcolare pm.max_children in base alla RAM:<\/strong><\/p>\n<p>Questa \u00e8 la formula che uso io, e funziona in modo affidabile su tutti i server che gestisco. Ogni processo PHP-FPM per un sito WordPress tipico consuma circa <strong>30-50 MB di RAM<\/strong> (puoi verificare il valore esatto sul tuo server con il comando <strong>ps aux &#8211;sort=-rss | grep php-fpm | head -20<\/strong> e guardando la colonna RSS).<\/p>\n<p>La formula \u00e8: <strong>pm.max_children = (RAM disponibile per PHP) \/ (Memoria media per processo)<\/strong><\/p>\n<p>Dove &#8220;RAM disponibile per PHP&#8221; \u00e8 la RAM totale del server meno quella usata dal sistema operativo, dal web server, dal database e da altri servizi. In pratica:<\/p>\n<ul>\n<li><strong>Server con 2 GB di RAM:<\/strong> circa 1 GB disponibile per PHP \u2192 pm.max_children = <strong>20-25<\/strong><\/li>\n<li><strong>Server con 4 GB di RAM:<\/strong> circa 2,5 GB disponibili per PHP \u2192 pm.max_children = <strong>50-60<\/strong><\/li>\n<li><strong>Server con 8 GB di RAM:<\/strong> circa 5-6 GB disponibili per PHP \u2192 pm.max_children = <strong>100-150<\/strong><\/li>\n<li><strong>Server con 16 GB di RAM:<\/strong> circa 10-12 GB disponibili per PHP \u2192 pm.max_children = <strong>200-300<\/strong><\/li>\n<\/ul>\n<p><strong>Come configurare questi valori su Plesk:<\/strong><\/p>\n<ol>\n<li>Accedi a <strong>Plesk \u2192 Strumenti e Impostazioni \u2192 Impostazioni PHP<\/strong> per la configurazione a livello server (globale).<\/li>\n<li>Oppure vai in <strong>Plesk \u2192 Dominio specifico \u2192 Impostazioni PHP \u2192 Impostazioni PHP-FPM<\/strong> per la configurazione per singolo dominio.<\/li>\n<li>Nella sezione <strong>&#8220;Parametri aggiuntivi di PHP-FPM&#8221;<\/strong>, inserisci i valori. Per un server da 4 GB con configurazione dynamic, la mia configurazione tipica \u00e8:<\/li>\n<\/ol>\n<p><strong>Esempio per server 4 GB RAM, WordPress con traffico medio:<\/strong><\/p>\n<pre>\npm = dynamic\npm.max_children = 50\npm.start_servers = 10\npm.min_spare_servers = 5\npm.max_spare_servers = 20\npm.max_requests = 500\npm.process_idle_timeout = 10s\n<\/pre>\n<p><strong>Esempio per VPS 2 GB RAM, pochi siti a basso traffico:<\/strong><\/p>\n<pre>\npm = ondemand\npm.max_children = 20\npm.process_idle_timeout = 10s\npm.max_requests = 500\n<\/pre>\n<p><strong>Esempio per server dedicato 16 GB RAM, siti ad alto traffico:<\/strong><\/p>\n<pre>\npm = dynamic\npm.max_children = 250\npm.start_servers = 30\npm.min_spare_servers = 15\npm.max_spare_servers = 50\npm.max_requests = 1000\n<\/pre>\n<p>Il parametro <strong>pm.max_requests<\/strong> \u00e8 fondamentale per prevenire memory leak: dopo il numero specificato di richieste, il processo viene terminato e ricreato, liberando eventuale memoria accumulata. Un valore tra 500 e 1000 \u00e8 il mio standard. Non mettere 0 (infinito) a meno che tu non sia certo che non ci siano leak \u2014 con WordPress e i suoi plugin, i leak sono sempre dietro l&#8217;angolo.<\/p>\n<h2>3. Abilitare e Ottimizzare OPcache: Il Turbo per PHP<\/h2>\n<p><strong>OPcache<\/strong> \u00e8 forse l&#8217;ottimizzazione singola pi\u00f9 impattante che puoi fare su un server PHP. Per capire perch\u00e9, devi sapere come funziona PHP: ogni volta che una pagina PHP viene richiesta, il motore PHP deve <strong>leggere il file dal disco, compilarlo in bytecode, eseguire il bytecode e restituire il risultato<\/strong>. OPcache elimina i primi due passaggi memorizzando il bytecode compilato nella <strong>memoria condivisa (shared memory)<\/strong>, cos\u00ec che alle richieste successive PHP trovi il bytecode gi\u00e0 pronto per l&#8217;esecuzione. Il risultato \u00e8 una riduzione del tempo di esecuzione di PHP del <strong>50-70%<\/strong> in scenari reali.<\/p>\n<p>Su Plesk, OPcache \u00e8 generalmente abilitato di default, ma con valori troppo bassi. Ecco i parametri fondamentali e i valori che uso io:<\/p>\n<ol>\n<li><strong>opcache.enable = 1<\/strong> \u2014 Abilita OPcache. Dovrebbe essere gi\u00e0 attivo, ma verifica.<\/li>\n<li><strong>opcache.memory_consumption = 256<\/strong> \u2014 La quantit\u00e0 di memoria (in MB) dedicata alla cache del bytecode. Il valore predefinito \u00e8 spesso 64 o 128 MB, che \u00e8 insufficiente per server con molti siti o siti WordPress con molti plugin. Per un server con 5-10 siti WordPress, 256 MB \u00e8 il minimo consigliato. Per server con 20+ siti, considera 512 MB.<\/li>\n<li><strong>opcache.max_accelerated_files = 30000<\/strong> \u2014 Il numero massimo di file PHP che possono essere memorizzati nella cache. Il valore predefinito (2000-4000) \u00e8 ridicolmente basso: un singolo sito WordPress con WooCommerce e una decina di plugin pu\u00f2 avere oltre 10.000 file PHP. Il valore massimo \u00e8 1000000, ma 30000 \u00e8 un buon compromesso per la maggior parte dei server. Per server con molti siti, usa <strong>50000 o 100000<\/strong>.<\/li>\n<li><strong>opcache.revalidate_freq = 60<\/strong> \u2014 Ogni quanti secondi PHP controlla se i file sorgente sono cambiati. Il valore predefinito \u00e8 2 secondi, che \u00e8 troppo frequente per un sito in produzione. Con 60 secondi, il controllo avviene una volta al minuto, riducendo le operazioni di I\/O su disco. Su siti stabili in produzione puoi alzarlo anche a <strong>120 o 300<\/strong>. Se stai sviluppando attivamente, metti 0 per controllare ad ogni richiesta.<\/li>\n<li><strong>opcache.validate_timestamps = 1<\/strong> \u2014 Se impostato a 0, PHP non controller\u00e0 mai se i file sono cambiati, usando sempre la versione in cache. Massime prestazioni ma devi svuotare la cache manualmente ad ogni aggiornamento del codice. <strong>Consiglio di tenerlo a 1<\/strong> in ambienti Plesk dove gli utenti aggiornano WordPress e i plugin tramite la dashboard.<\/li>\n<li><strong>opcache.interned_strings_buffer = 16<\/strong> \u2014 Memoria dedicata alle stringhe internate (stringhe ripetute nel codice PHP). Il valore predefinito (4 o 8 MB) \u00e8 spesso insufficiente. 16 MB \u00e8 il mio standard.<\/li>\n<li><strong>opcache.save_comments = 1<\/strong> \u2014 Necessario per molti framework PHP (incluso WordPress con alcuni plugin) che usano le annotations nei commenti. Mantienilo attivo.<\/li>\n<li><strong>opcache.fast_shutdown = 1<\/strong> \u2014 Abilita una sequenza di shutdown pi\u00f9 veloce dei processi. Non ha controindicazioni, attivalo sempre. (Nota: deprecato in PHP 8.x dove \u00e8 sempre attivo.)<\/li>\n<\/ol>\n<p><strong>Come configurare OPcache su Plesk:<\/strong><\/p>\n<ol>\n<li>Vai in <strong>Plesk \u2192 Strumenti e Impostazioni \u2192 Impostazioni PHP<\/strong> (per la configurazione globale del server).<\/li>\n<li>Seleziona la versione PHP che stai utilizzando (consiglio <strong>PHP 8.2 o 8.3<\/strong> nel 2026).<\/li>\n<li>Cerca la sezione <strong>&#8220;Impostazioni di OPcache&#8221;<\/strong> o modifica direttamente i valori in <strong>&#8220;Direttive PHP aggiuntive&#8221;<\/strong>.<\/li>\n<li>Inserisci i seguenti valori nella casella delle direttive aggiuntive:<\/li>\n<\/ol>\n<pre>\nopcache.enable=1\nopcache.memory_consumption=256\nopcache.max_accelerated_files=30000\nopcache.revalidate_freq=60\nopcache.validate_timestamps=1\nopcache.interned_strings_buffer=16\nopcache.save_comments=1\n<\/pre>\n<ol start=\"5\">\n<li>Salva e riavvia PHP-FPM con il comando: <strong>systemctl restart plesk-php82-fpm<\/strong> (adatta il numero di versione alla tua installazione, ad esempio <strong>plesk-php83-fpm<\/strong> per PHP 8.3).<\/li>\n<\/ol>\n<p>Puoi anche configurare OPcache <strong>per singolo dominio<\/strong> andando in Plesk \u2192 Dominio \u2192 Impostazioni PHP \u2192 Direttive PHP aggiuntive. Questo \u00e8 utile se hai siti con esigenze diverse: ad esempio un sito in sviluppo attivo potrebbe avere revalidate_freq=0 mentre i siti in produzione usano 60.<\/p>\n<h2>4. Monitorare PHP-FPM: La Status Page e i Comandi Essenziali<\/h2>\n<p>Ottimizzare senza monitorare \u00e8 come guidare bendati. Dopo aver configurato PHP-FPM e OPcache, \u00e8 fondamentale <strong>verificare che la configurazione funzioni<\/strong> e che non ci siano colli di bottiglia. PHP-FPM offre una status page integrata che \u00e8 uno strumento diagnostico preziosissimo.<\/p>\n<p><strong>Abilitare la status page di PHP-FPM su Plesk:<\/strong><\/p>\n<ol>\n<li>Modifica il file di configurazione del pool PHP-FPM. Su Plesk, lo trovi in: <strong>\/opt\/plesk\/php\/8.2\/etc\/php-fpm.d\/<\/strong> (adatta il percorso alla tua versione PHP). I file dei pool per dominio sono generati automaticamente da Plesk.<\/li>\n<li>Aggiungi (o verifica che ci sia) la direttiva: <strong>pm.status_path = \/fpm-status<\/strong><\/li>\n<li>Per accedere alla status page dall&#8217;esterno, puoi configurare una location in Nginx. In alternativa, accedi via CLI direttamente sul server con il comando:<br \/>\n    <strong>SCRIPT_NAME=\/fpm-status SCRIPT_FILENAME=\/fpm-status REQUEST_METHOD=GET cgi-fcgi -bind -connect \/run\/plesk-php82-fpm.sock<\/strong><\/li>\n<li>Un metodo pi\u00f9 pratico \u00e8 usare curl puntando al socket Unix:<br \/>\n    <strong>curl &#8211;unix-socket \/run\/plesk-php82-fpm.sock http:\/\/localhost\/fpm-status?full<\/strong><\/li>\n<\/ol>\n<p><strong>Cosa guardare nella status page:<\/strong><\/p>\n<ul>\n<li><strong>active processes:<\/strong> Quanti processi stanno gestendo richieste in questo momento. Se questo numero \u00e8 costantemente vicino a max_children, hai bisogno di pi\u00f9 processi.<\/li>\n<li><strong>idle processes:<\/strong> Processi in standby pronti a gestire nuove richieste. Se \u00e8 sempre 0, il server \u00e8 saturo.<\/li>\n<li><strong>listen queue:<\/strong> Richieste in attesa di un processo libero. Se questo numero \u00e8 maggiore di 0 frequentemente, <strong>devi aumentare pm.max_children<\/strong>. \u00c8 il segnale di allarme pi\u00f9 importante.<\/li>\n<li><strong>max listen queue:<\/strong> Il valore massimo raggiunto dalla coda. Se \u00e8 alto, indica che ci sono stati picchi di traffico non gestiti.<\/li>\n<li><strong>max children reached:<\/strong> Il numero di volte in cui il limite pm.max_children \u00e8 stato raggiunto. Se questo numero cresce, devi assolutamente aumentare max_children (o ottimizzare le performance del codice PHP per ridurre il tempo di esecuzione di ogni richiesta).<\/li>\n<\/ul>\n<p><strong>Comandi utili per il monitoraggio dalla CLI:<\/strong><\/p>\n<ul>\n<li>Verificare quanti processi PHP-FPM sono attivi e quanta memoria consumano:<br \/>\n    <strong>ps aux &#8211;sort=-rss | grep php-fpm | head -20<\/strong><\/li>\n<li>Calcolare la memoria media per processo PHP-FPM:<br \/>\n    <strong>ps &#8211;no-headers -o rss -C php-fpm | awk &#8216;{ total += $1; count++ } END { print total\/count\/1024 &#8221; MB per processo, &#8221; count &#8221; processi totali&#8221; }&#8217;<\/strong><\/li>\n<li>Monitorare in tempo reale i processi PHP-FPM:<br \/>\n    <strong>watch -n 1 &#8220;ps aux | grep php-fpm | grep -v grep | wc -l&#8221;<\/strong><\/li>\n<li>Controllare i log di PHP-FPM per errori:<br \/>\n    <strong>tail -f \/var\/log\/plesk-php82-fpm\/error.log<\/strong><\/li>\n<li>Verificare lo stato del servizio PHP-FPM:<br \/>\n    <strong>systemctl status plesk-php82-fpm<\/strong><\/li>\n<\/ul>\n<p>Ti consiglio di controllare questi parametri <strong>almeno una volta a settimana<\/strong>, e ogni volta che fai modifiche alla configurazione. Se gestisci server in produzione con traffico significativo, valuta di configurare un sistema di monitoraggio automatico come <strong>Zabbix, Munin o Netdata<\/strong> che pu\u00f2 raccogliere queste metriche in modo continuo e avvisarti quando qualcosa va fuori norma.<\/p>\n<h2>5. Verificare il Hit Rate di OPcache e Diagnosticare Problemi<\/h2>\n<p>Una volta configurato OPcache, devi verificare che stia effettivamente funzionando e che la cache sia dimensionata correttamente. Il parametro chiave da monitorare \u00e8 l&#8217;<strong>hit rate<\/strong>: la percentuale di richieste servite dalla cache bytecode anzich\u00e9 richiedere la ricompilazione del file PHP. Un hit rate sano deve essere <strong>superiore al 99%<\/strong>. Se \u00e8 inferiore al 95%, c&#8217;\u00e8 un problema di configurazione.<\/p>\n<p><strong>Metodo 1 \u2014 Dalla riga di comando:<\/strong><\/p>\n<ol>\n<li>Crea un file PHP temporaneo (ricorda di eliminarlo dopo!) in una directory accessibile dal web:<br \/>\n    <strong>echo &#8216;&lt;?php phpinfo(); ?&gt;&#8217; &gt; \/var\/www\/vhosts\/tuodominio.it\/httpdocs\/opcache-test.php<\/strong><\/li>\n<li>Accedi al file dal browser. Cerca la sezione <strong>&#8220;Zend OPcache&#8221;<\/strong>. Verifica che sia abilitato e controlla i valori di &#8220;Cached scripts&#8221;, &#8220;Cached keys&#8221;, &#8220;Memory used&#8221; e &#8220;Hit rate&#8221;.<\/li>\n<li><strong>Elimina il file immediatamente dopo il test:<\/strong> lasciare un phpinfo() accessibile pubblicamente \u00e8 un rischio di sicurezza grave.<\/li>\n<\/ol>\n<p><strong>Metodo 2 \u2014 Script di diagnostica pi\u00f9 completo:<\/strong><\/p>\n<p>Crea un file PHP temporaneo con il seguente contenuto per avere un report dettagliato:<\/p>\n<pre>\n&lt;?php\n$status = opcache_get_status();\n$config = opcache_get_configuration();\n$hitRate = $status['opcache_statistics']['hits'] \/\n    ($status['opcache_statistics']['hits'] + $status['opcache_statistics']['misses']) * 100;\n\necho \"OPcache Hit Rate: \" . round($hitRate, 2) . \"%n\";\necho \"Memoria usata: \" . round($status['memory_usage']['used_memory']\/1024\/1024, 2) . \" MBn\";\necho \"Memoria libera: \" . round($status['memory_usage']['free_memory']\/1024\/1024, 2) . \" MBn\";\necho \"Script in cache: \" . $status['opcache_statistics']['num_cached_scripts'] . \"n\";\necho \"Max script supportati: \" . $config['directives']['opcache.max_accelerated_files'] . \"n\";\necho \"Restarts (OOM): \" . $status['opcache_statistics']['oom_restarts'] . \"n\";\necho \"Restarts (hash): \" . $status['opcache_statistics']['hash_restarts'] . \"n\";\n?&gt;\n<\/pre>\n<p><strong>Metodo 3 \u2014 Interfaccia grafica con opcache-gui:<\/strong><\/p>\n<p>Esiste un tool open source chiamato <strong>opcache-gui<\/strong> (disponibile su GitHub) che offre un&#8217;interfaccia web completa per visualizzare lo stato di OPcache con grafici e metriche dettagliate. Scaricalo, mettilo in una directory protetta da password tramite .htaccess e usalo per monitorare OPcache. Il link diretto del progetto su GitHub si trova cercando &#8220;amnuts opcache-gui&#8221;.<\/p>\n<p><strong>Problemi comuni e soluzioni:<\/strong><\/p>\n<ul>\n<li><strong>Hit rate basso (sotto 95%):<\/strong> Di solito indica che <strong>opcache.max_accelerated_files<\/strong> \u00e8 troppo basso e i file vengono espulsi dalla cache per fare spazio. Aumenta il valore a 50000 o 100000.<\/li>\n<li><strong>Memoria OPcache esaurita (oom_restarts &gt; 0):<\/strong> Significa che la memoria assegnata a OPcache \u00e8 insufficiente. Aumenta <strong>opcache.memory_consumption<\/strong> a 256 o 512 MB.<\/li>\n<li><strong>OPcache si resetta frequentemente:<\/strong> Controlla se qualche plugin WordPress o cron job sta chiamando <strong>opcache_reset()<\/strong>. Alcuni plugin di caching (come WP Super Cache in certe configurazioni) lo fanno inutilmente. Verifica nei log e disattiva il plugin problematico.<\/li>\n<li><strong>Modifiche al codice non visibili:<\/strong> Se aggiorni un file PHP e le modifiche non appaiono subito, \u00e8 perch\u00e9 OPcache sta servendo la versione in cache. Attendi il tempo impostato in revalidate_freq oppure svuota la cache manualmente con: <strong>php -r &#8220;opcache_reset();&#8221;<\/strong> dalla CLI, oppure riavviando PHP-FPM con <strong>systemctl reload plesk-php82-fpm<\/strong>.<\/li>\n<\/ul>\n<h2>6. Benchmark Prima e Dopo: I Risultati Reali<\/h2>\n<p>Le ottimizzazioni che ho descritto non sono teoriche: producono <strong>miglioramenti misurabili e significativi<\/strong>. Ti mostro i benchmark che eseguo sui server dei miei clienti prima e dopo l&#8217;ottimizzazione, usando strumenti professionali. Questi sono risultati tipici che riscontro nella pratica quotidiana.<\/p>\n<p><strong>Strumenti di benchmark che utilizzo:<\/strong><\/p>\n<ul>\n<li><strong>GTmetrix<\/strong> (gtmetrix.com): Per misurare i tempi di caricamento delle pagine web dal punto di vista dell&#8217;utente, inclusi TTFB (Time To First Byte), LCP (Largest Contentful Paint) e Speed Index.<\/li>\n<li><strong>Apache Bench (ab):<\/strong> Per testare le prestazioni del server sotto carico, simulando richieste concorrenti. Il comando tipico che uso \u00e8:<br \/>\n    <strong>ab -n 1000 -c 50 https:\/\/tuodominio.it\/<\/strong><br \/>\n    (1000 richieste totali, 50 concorrenti).<\/li>\n<li><strong>curl con timing:<\/strong> Per misurare il TTFB con precisione:<br \/>\n    <strong>curl -o \/dev\/null -s -w &#8220;TTFB: %{time_starttransfer}snTotal: %{time_total}sn&#8221; https:\/\/tuodominio.it\/<\/strong><\/li>\n<li><strong>siege:<\/strong> Alternativa ad Apache Bench per test di carico pi\u00f9 realistici:<br \/>\n    <strong>siege -c 25 -t 30S https:\/\/tuodominio.it\/<\/strong><br \/>\n    (25 utenti concorrenti per 30 secondi).<\/li>\n<\/ul>\n<p><strong>Risultati tipici \u2014 Sito WordPress medio (tema standard, 10 plugin, WooCommerce):<\/strong><\/p>\n<p><strong>Prima dell&#8217;ottimizzazione (configurazione Plesk default):<\/strong><\/p>\n<ul>\n<li>TTFB: <strong>800-1200 ms<\/strong><\/li>\n<li>Tempo di caricamento pagina completo: <strong>3.5-5.0 secondi<\/strong><\/li>\n<li>Apache Bench (50 concorrenti): <strong>15-25 richieste\/secondo<\/strong>, diversi errori 502\/503<\/li>\n<li>GTmetrix Performance Score: <strong>65-75%<\/strong><\/li>\n<\/ul>\n<p><strong>Dopo l&#8217;ottimizzazione PHP-FPM + OPcache:<\/strong><\/p>\n<ul>\n<li>TTFB: <strong>150-350 ms<\/strong><\/li>\n<li>Tempo di caricamento pagina completo: <strong>1.2-2.0 secondi<\/strong><\/li>\n<li>Apache Bench (50 concorrenti): <strong>80-150 richieste\/secondo<\/strong>, zero errori<\/li>\n<li>GTmetrix Performance Score: <strong>88-95%<\/strong><\/li>\n<\/ul>\n<p>Stiamo parlando di un <strong>miglioramento del 60-75% sul TTFB<\/strong> e di un <strong>aumento di 4-6 volte nelle richieste gestite al secondo<\/strong>. E questo \u00e8 solo con l&#8217;ottimizzazione PHP-FPM e OPcache, senza toccare altri aspetti come il caching a livello applicativo (Redis, Memcached), il caching delle pagine (WP Super Cache, WP Rocket) o l&#8217;ottimizzazione del database. Combinando tutte queste ottimizzazioni, i risultati sono ancora pi\u00f9 impressionanti.<\/p>\n<p><strong>Errori comuni che vedo frequentemente:<\/strong><\/p>\n<ul>\n<li><strong>pm.max_children troppo basso:<\/strong> \u00c8 l&#8217;errore numero uno. Con il valore di default di Plesk (spesso 5-10), bastano poche richieste concorrenti per saturare il pool. Sotto traffico reale, le richieste vanno in coda e il sito diventa lentissimo o restituisce errori 502\/504.<\/li>\n<li><strong>OPcache disabilitato o con memoria troppo bassa:<\/strong> Alcuni provider di hosting disabilitano OPcache o lo configurano con 32-64 MB, insufficienti per siti WordPress complessi. Il risultato \u00e8 che PHP deve ricompilare il bytecode ad ogni richiesta, uno spreco enorme.<\/li>\n<li><strong>PHP versione troppo vecchia:<\/strong> Ogni nuova versione di PHP porta miglioramenti di prestazioni significativi. <strong>PHP 8.3 \u00e8 circa il 20-30% pi\u00f9 veloce di PHP 7.4<\/strong> in scenari reali. Se stai ancora su PHP 7.x, aggiornare \u00e8 l&#8217;ottimizzazione pi\u00f9 grande che puoi fare, e il passaggio si gestisce facilmente da Plesk.<\/li>\n<li><strong>Non riavviare PHP-FPM dopo le modifiche:<\/strong> Le modifiche alla configurazione di PHP-FPM e OPcache richiedono un riavvio del servizio per essere applicate. Usa <strong>systemctl restart plesk-php82-fpm<\/strong> dopo ogni modifica. Un semplice <strong>reload<\/strong> \u00e8 sufficiente per la maggior parte dei cambiamenti di configurazione ed \u00e8 meno invasivo.<\/li>\n<li><strong>Ignorare i log:<\/strong> I log di PHP-FPM (<strong>\/var\/log\/plesk-php82-fpm\/error.log<\/strong>) contengono informazioni preziose: avvisi di &#8220;server reached pm.max_children&#8221;, errori di memoria, warning di script lenti. Controllali regolarmente.<\/li>\n<\/ul>\n<h2>Domande Frequenti<\/h2>\n<h3>L&#8217;ottimizzazione PHP-FPM e OPcache funziona anche con Nginx standalone senza Apache?<\/h3>\n<p>S\u00ec, assolutamente. PHP-FPM funziona in modo identico sia con <strong>Apache + mod_proxy_fcgi<\/strong>, sia con <strong>Nginx come reverse proxy di Apache<\/strong> (la configurazione predefinita di Plesk), sia con <strong>Nginx standalone<\/strong>. Anzi, la configurazione Nginx standalone + PHP-FPM \u00e8 la pi\u00f9 efficiente perch\u00e9 elimina il passaggio tramite Apache, riducendo l&#8217;overhead e il consumo di memoria. Su Plesk puoi scegliere il web server in <strong>Strumenti e Impostazioni \u2192 Impostazioni del server web<\/strong>. Se i tuoi siti non hanno bisogno di .htaccess, passare a Nginx standalone pu\u00f2 darti un ulteriore boost prestazionale del 10-20%.<\/p>\n<h3>Devo configurare OPcache diversamente per WooCommerce rispetto a WordPress standard?<\/h3>\n<p><strong>WooCommerce ha bisogno di pi\u00f9 risorse<\/strong> rispetto a un WordPress semplice. Un sito WooCommerce con molti prodotti ha migliaia di file PHP aggiuntivi (i template dei prodotti, le classi del carrello, i gateway di pagamento, ecc.) e ogni pagina prodotto genera richieste PHP pi\u00f9 pesanti. Per WooCommerce consiglio di aumentare <strong>opcache.max_accelerated_files<\/strong> almeno a 50000 e <strong>opcache.memory_consumption<\/strong> ad almeno 256 MB. Inoltre, pm.max_children dovrebbe essere pi\u00f9 alto perch\u00e9 le pagine WooCommerce hanno tempi di esecuzione pi\u00f9 lunghi (specialmente checkout e carrello), il che significa che ogni processo resta occupato pi\u00f9 a lungo.<\/p>\n<h3>Come faccio a svuotare la cache OPcache senza riavviare PHP-FPM?<\/h3>\n<p>Ci sono diversi metodi. Il pi\u00f9 semplice \u00e8 creare un piccolo script PHP:<br \/>\n<strong>&lt;?php opcache_reset(); echo &#8220;OPcache svuotata&#8221;; ?&gt;<\/strong><br \/>\nChiamalo dal browser, poi eliminalo immediatamente. In alternativa, dalla CLI puoi usare:<br \/>\n<strong>php -r &#8220;opcache_reset();&#8221;<\/strong><br \/>\nAttenzione: la CLI e PHP-FPM hanno istanze OPcache separate. Lo script dalla CLI svuota solo la cache della CLI. Per svuotare la cache di PHP-FPM, devi usare lo script via browser o fare un <strong>reload del servizio<\/strong>: <strong>systemctl reload plesk-php82-fpm<\/strong>. Molti plugin WordPress (come <strong>WP OPcache<\/strong> o <strong>LiteSpeed Cache<\/strong>) offrono un bottone &#8220;Purge OPcache&#8221; direttamente dalla dashboard di WordPress.<\/p>\n<h3>Quanta RAM del server viene consumata da OPcache?<\/h3>\n<p>OPcache utilizza <strong>memoria condivisa (shared memory)<\/strong>, il che significa che la memoria viene allocata una sola volta e condivisa tra tutti i processi PHP-FPM. Se imposti opcache.memory_consumption=256, quei 256 MB vengono allocati una volta sola, indipendentemente dal numero di processi PHP-FPM attivi. Non \u00e8 come la RAM dei processi PHP-FPM che viene moltiplicata per ogni processo. Questo rende OPcache estremamente efficiente: 256 MB di shared memory possono servire centinaia di processi. L&#8217;investimento di memoria \u00e8 minimo rispetto al ritorno in prestazioni.<\/p>\n<h3>Posso usare queste ottimizzazioni anche su un hosting condiviso Plesk?<\/h3>\n<p>Dipende dal livello di accesso che il provider ti concede. Sugli hosting condivisi, tipicamente <strong>non hai accesso alla configurazione globale di PHP-FPM<\/strong> (pm.max_children e simili) perch\u00e9 questa \u00e8 gestita dal provider. Tuttavia, molti provider consentono di modificare le <strong>direttive PHP per dominio<\/strong>, incluse quelle di OPcache, tramite il pannello Plesk del tuo dominio o tramite un file <strong>.user.ini<\/strong> nella root del sito. Puoi sicuramente configurare opcache.revalidate_freq, opcache.validate_timestamps e altre direttive a livello applicativo. Per le ottimizzazioni PHP-FPM a livello server, hai bisogno almeno di un <strong>VPS<\/strong> con accesso root.<\/p>\n<h2>La Mia Soluzione Definitiva<\/h2>\n<p>L&#8217;ottimizzazione di PHP-FPM e OPcache su Plesk \u00e8 una delle attivit\u00e0 con il <strong>miglior rapporto sforzo\/risultato<\/strong> che puoi fare su un server web. Con 15-30 minuti di lavoro ben fatto, puoi trasformare un server lento e instabile in una macchina che serve i siti in modo rapido e affidabile. La chiave \u00e8 trattare questa ottimizzazione come un processo strutturato: <strong>analisi iniziale<\/strong> delle risorse disponibili e del carico di lavoro, <strong>configurazione mirata<\/strong> di PHP-FPM in base alla RAM e al traffico, <strong>ottimizzazione di OPcache<\/strong> con valori adeguati al numero di file PHP e al tipo di siti, e infine <strong>monitoraggio continuo<\/strong> per verificare che tutto funzioni e adattarsi ai cambiamenti nel tempo.<\/p>\n<p>Se gestisci server Plesk con siti WordPress o applicazioni PHP e vuoi ottenere il massimo dalle tue risorse hardware, o se hai bisogno di aiuto per diagnosticare problemi di prestazioni, <strong>contattami<\/strong>. Posso analizzare la configurazione del tuo server, identificare i colli di bottiglia specifici e applicare le ottimizzazioni personalizzate per il tuo caso. In oltre vent&#8217;anni di amministrazione di sistemi ho ottimizzato server di ogni dimensione \u2014 dal piccolo VPS con 2 GB di RAM al server dedicato con 128 GB \u2014 e in ogni caso il risultato \u00e8 stato un miglioramento tangibile e misurabile delle prestazioni.<\/p>\n<p><strong><a href=\"https:\/\/darioiannascoli.it\/#contatti\">Contattami per ottimizzare le prestazioni PHP del tuo server Plesk<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scopri come ottimizzare PHP-FPM e OPcache su Plesk per velocizzare siti WordPress e PHP. Guida con configurazione pool, parametri e benchmark.<\/p>\n","protected":false},"author":1,"featured_media":821,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"Come Ottimizzare PHP-FPM e OPcache su Plesk per Velocizzare i Siti","_seopress_titles_desc":"Scopri come ottimizzare PHP-FPM e OPcache su Plesk per velocizzare siti WordPress e PHP. Guida con configurazione pool, parametri e benchmark prestazioni.","_seopress_robots_index":"","footnotes":""},"categories":[4],"tags":[54,52,53,63],"class_list":["post-741","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk","tag-configurazione-plesk","tag-ottimizzazione-server","tag-plesk-panel","tag-wordpress-plesk"],"_links":{"self":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts\/741","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/comments?post=741"}],"version-history":[{"count":0,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/posts\/741\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/media\/821"}],"wp:attachment":[{"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/media?parent=741"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/categories?post=741"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/darioiannascoli.it\/blog\/wp-json\/wp\/v2\/tags?post=741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}