lavoratori in php sono processi indipendenti che eseguono il codice PHP e quindi elaborano ogni richiesta dinamica proveniente da un sito web. Se troppe richieste non memorizzate nella cache arrivano al server nello stesso momento, i worker esistenti occupano tutti gli slot, si forma una coda e il collo di bottiglia porta a lunghi tempi di risposta, TTFB-Suggerimenti ed errori.
Punti centrali
Riassumo i seguenti messaggi chiave in modo compatto, in modo che possiate prendere rapidamente le decisioni giuste per Prestazioni e capacità.
- Definizione diI PHP Worker elaborano le richieste in modo seriale, una sola richiesta per worker.
- Collo di bottigliaTroppo pochi lavoratori creano code, il TTFB aumenta e i timeout sono imminenti.
- RisorseI worker richiedono core della CPU; un rapporto errato causa la commutazione del contesto.
- CachingPiù visite vengono effettuate dalla cache, minore è il carico dei lavoratori durante i picchi di traffico.
- ScalaRegolare il numero di lavoratori in base al profilo della pagina, ai plugin e alle interazioni.
Cosa sono i PHP Worker nel contesto dell'hosting?
Capisco Lavoratori PHP come camerieri digitali che servono ogni richiesta dinamica individualmente. Un worker legge lo script PHP, attiva le query del database e le utilizza per costruire l'HTML per il browser. Se un task è in esecuzione, il worker rimane vincolato fino al completamento e solo allora è nuovamente disponibile, parallelo non funziona. In WordPress, i worker eseguono anche compiti ricorrenti come i cron job, l'invio di e-mail e i controlli di sicurezza. Proprio per questo motivo, il numero e la qualità dei lavoratori influenzano la velocità percepita di un sito web. sito web massiccia.
Quando e perché si verifica il collo di bottiglia dei lavoratori?
Un collo di bottiglia si verifica non appena arriva un numero di richieste non memorizzate nella cache superiore a quello di Lavoratore sono disponibili. Ogni richiesta aggiuntiva finisce quindi in coda e attende uno slot libero. Ciò aumenta il tempo di risposta al primo byte, allunga i tempi di caricamento e può causare l'annullamento dei processi di checkout. Nei negozi o nelle aree riservate ai membri, i contenuti personalizzati aggravano la situazione perché la cache non è in grado di fornire molte risposte, il che può rallentare il processo di checkout. Carico direttamente ai lavoratori. In questa situazione, ottengo il massimo effetto con una cache sensata, plug-in ottimizzati e un rapporto armonioso tra lavoratori e CPU.
Riconoscere i sintomi: Leggere correttamente le metriche e i log
Guardo prima di tutto TTFBperché valori crescenti indicano code. Errori come 504 Gateway Timeout si verificano quando le richieste rimangono bloccate per troppo tempo e vengono annullate con difficoltà. Nel pannello di hosting, riconosco le code attraverso un elevato numero di processi con un contemporaneo basso utilizzo della rete, tipico delle richieste bloccate. Lavoratore è. I log degli accessi mostrano quindi molte richieste simultanee a percorsi non memorizzati nella cache, come il carrello, il checkout o le dashboard personali. Se i tempi di risposta nel backend aumentano allo stesso tempo, le azioni di amministrazione pesanti di solito bloccano i singoli lavoratori per un periodo più lungo di necessario.
Differenziazione importante: server web vs. PHP-FPM
Faccio una chiara distinzione tra i lavoratori del server web (ad esempio, NGINX/Apache) e i lavoratori del server web (ad esempio, NGINX/Apache). Lavoratori PHP-FPM. Grazie a Keep-Alive e HTTP/2, il server web può moltiplicare molte connessioni e servire risorse statiche in modo estremamente parallelo. Tuttavia, il vero collo di bottiglia si presenta in PHP-FPM, dove ogni processo figlio elabora esattamente una richiesta. Anche se il browser apre decine di richieste in parallelo, il numero di processi PHP limita l'elaborazione simultanea di percorsi dinamici. Questa distinzione spiega perché le pagine con molti file statici appaiono veloci, mentre i singoli endpoint dinamici (checkout, login, REST API) si bloccano ancora.
Numero ottimale di worker: core di elaborazione, RAM e profilo dell'applicazione
Il numero ragionevole di lavoratori dipende dalla percentuale di pagine dinamiche, dal panorama dei plugin e dalle risorse disponibili. Core della CPU off. Non prevedo mai un numero di worker significativamente superiore ai core della CPU, perché il cambio di contesto permanente aumenta la latenza. Due o quattro worker sono di solito sufficienti per i piccoli blog, mentre i negozi attivi e gli LMS ne richiedono molti di più. Il fattore decisivo rimane l'interazione: un numero maggiore di lavoratori senza riserve di CPU non porta alcun beneficio. Accelerazione. Per questo motivo faccio una prova con carico, misuro il TTFB e verifico se lo spunto scompare prima di effettuare ulteriori aggiornamenti.
| Scenario | Non collegato | Lavoratore | Core della CPU | Effetto | Azione |
|---|---|---|---|---|---|
| Blog con cache | Molto basso | 2-4 | 2-4 | Consegna veloce | Mantenere la cache, Plugins mantenersi snelli |
| WooCommerce con suggerimenti | Medio-alto | 6-12 | 4-8 | Tempi di attesa brevi | Alleviare la cassa, Lavoratore aumento |
| Membri/LMS | Alto | 8-16 | 8-16 | Meno timeout | Personalizzazione della cache, CPU stringere |
| Applicazione con API | Alto | 8-20 | 8-20 | Più anche TTFB | Ottimizzare le query, Limiti set |
Regole empiriche per il dimensionamento
Per una prima sensazione, calcolo con la semplice approssimazione: Lavoratori necessari ≈ Richieste simultanee non memorizzate nella cache. Questa simultaneità viene calcolata moltiplicando la frequenza delle richieste per il tempo medio di elaborazione. Esempio: 10 richieste/s con 300 ms di tempo di servizio si traducono in circa 3 richieste PHP simultanee. Se prevedo riserve di sicurezza e brevi picchi, raddoppio questo valore. Importante: questo valore deve essere Core della CPU e RAM; un lavoratore senza tempo di CPU è solo un altro lavoratore in attesa.
Calcolate correttamente il vostro budget di stoccaggio
Ogni processo di PHP-FPM consuma RAM, a seconda di Versione PHPattivo Opcache e i plugin caricati. Misuro l'ingombro reale sotto carico (ps/top) e lo moltiplico per pm.max_childrenaggiungere i servizi di server web, database e cache. In questo modo evito lo swapping e l'OOM killer. Di norma, mantengo 20-30% di buffer di RAM libero. Se il consumo per processo aumenta in modo significativo, lo interpreto come un segnale per Dieta del pluginmeno estensioni o impostazioni più restrittive del limite di memoria per pool.
La cache come livello di rilievo
Quanto più imparo dal Cache meno energia consumano i lavoratori. La cache della pagina, la cache degli oggetti e la cache dei bordi riducono drasticamente l'esecuzione di PHP. Incapsulo le parti dinamiche come il carrello della spesa o i blocchi personalizzati con ESI o Ajax, in modo che il resto rimanga nella cache. Se volete approfondire l'argomento, potete trovare Caching lato server Guida alle strategie utili per NGINX e Apache che alleggeriscono realmente i lavoratori. Ecco come ridurre sensibilmente il TTFB e mantenere l'efficienza del sistema. Tempo di risposta basso sotto carico.
Prendo anche in considerazione Invalidazione della cache e strategie di riscaldamento: Dopo le implementazioni o le principali modifiche ai prodotti, riscaldo le pagine critiche e le rotte API. Nei negozi, carico le pagine delle categorie, i bestseller, la pagina iniziale e i precarichi del checkout per attenuare i picchi di avvio a freddo. Per le cache degli oggetti, faccio attenzione alle strategie di pulizia delle chiavi, in modo da non scartare inutilmente gli hotset.
Errori tipici e trappole costose
Molti inizialmente sospettano una mancanza di RAM o la CPU come problema principale, anche se la coda dei lavoratori è il vero collo di bottiglia. Pertanto, verifico se le pagine in cache rimangono veloci e se solo i percorsi dinamici sfuggono al controllo. Un'altra idea sbagliata è "più worker risolvono tutto", che senza core aggiuntivi si trasforma in un elevato numero di context switch e in una latenza peggiore. Allo stesso modo, i cattivi plugin vincolano un worker per un tempo eccessivamente lungo, aumentando la latenza percepita. Prestazioni si deteriora. Pertanto, riduco i componenti aggiuntivi, ottimizzo le query del database e ridimensiono le risorse all'unisono.
Hotspot specifici per WordPress
- admin-ajax.php e wp-jsonMolte piccole chiamate si accumulano e bloccano i lavoratori; io raggruppo le richieste e imposto cache ragionevoli.
- API HeartbeatNel backend, limito le frequenze in modo che non ci siano inutilmente molte richieste simultanee.
- WooCommerce wc-ajaxI controlli del carrello, delle spedizioni e dei coupon spesso non vengono memorizzati nella cache; riduco le chiamate API esterne e ottimizzo gli hook.
- I transitori e OpzioniLe opzioni di autocaricamento troppo piene o le costose rigenerazioni transitorie prolungano il tempo di esecuzione di PHP e quindi l'impegno di slot.
Pratica: Da tre a otto lavoratori - senza congestione
Supponendo che un negozio operi solo tre Lavoratore e sperimenta inceppamenti di cassa la sera. Per prima cosa analizzo i percorsi che non provengono dalla cache e misuro il TTFB sotto carico. Poi attivo la cache delle pagine e degli oggetti puliti ed esternalizzo solo le aree personalizzate. Aumento quindi i lavoratori a otto e aggiungo allo stesso tempo altri due Core della CPU libero. Nel test di carico successivo, le code diminuiscono e il tasso di errore si riduce notevolmente.
Facoltativamente, posso anche attenuare i picchi impostando limiti conservativi per gli endpoint costosi nel server web (ad esempio, un basso numero di upstream simultanei per il checkout), mentre fornisco contenuti statici e in cache a velocità illimitata. In questo modo si toglie pressione al pool di FPM e si stabilizza il TTFB in generale, anche se le azioni dei singoli utenti sono brevemente più lente.
Monitoraggio e test di carico: gli strumenti che utilizzo
Seguo TTFBIl tempo di risposta e il tasso di errore a brevi intervalli per rilevare tempestivamente la congestione. Per il carico sintetico, utilizzo strumenti come K6 o Loader, che generano picchi realistici. I log delle applicazioni aiutano a identificare le query lente e le chiamate API esterne che bloccano i lavoratori. Controllo anche le pagine di stato di PHP FPM per tenere d'occhio gli slot occupati, in attesa e liberi. Se gli slot si riempiono in modo permanente, aumento i lavoratori e CPU passo dopo passo e verificare ogni fase con un carico di prova.
Interpretare le metriche in modo affidabile
- bambini massimi raggiuntiIl limite superiore è stato raggiunto; le richieste sono in attesa: è il momento di avere più lavoratori o una cache più veloce.
- coda di ascoltoUna coda crescente conferma la congestione davanti a FPM; controllo le impostazioni del server web e dell'upstream.
- timeout_richiesta_slowlog e slowlog: Identifica le posizioni esatte della richiesta a cui sono collegati i lavoratori.
- tempo_di_risposta_a_stream nei log del server web: Mostra per quanto tempo PHP ha risposto; sono correlato con tempo_richiesta e i codici di stato (502/504).
Interpretare correttamente i segnali di aggiornamento specifici
Se il TTFB Se si verifica un aumento notevole del traffico nonostante la cache attiva, di solito si tratta di una mancanza di capacità di lavoro. Se si verificano frequenti 504 errori durante azioni come il checkout o il login, si tratta di un vero e proprio ingorgo. Un numero maggiore di ordini simultanei, campagne spontanee o lanci giustificano la presenza di lavoratori aggiuntivi per garantire il corretto svolgimento delle transazioni. Se si verifica lo stato di errore 503, vale la pena dare un'occhiata a questa guida per Errore 503 di WordPressperché processi e limiti errati producono effetti simili. Decido quindi se utilizzare Worker, CPU o timeout.
Configurazione: PHP-FPM e limiti sensibili
Con PHP-FPM determino con pm.max_children il numero massimo di processi simultanei e quindi il limite superiore dei lavoratori. Uso pm.start_servers e pm.min/max_spare_servers per controllare la rapidità con cui la capacità è disponibile. pm.max_requests protegge dalle perdite di memoria, riavviando i processi dopo X richieste. request_terminate_timeout protegge i runner lunghi, in modo che un worker non rimanga bloccato per sempre e blocchi gli slot, che imposto con attenzione per i percorsi di checkout. Questi set hanno un effetto diretto sulle code, quindi li modifico solo insieme a Test.
Scelgo il giusto pm-modo consapevole: dinamico per carichi fluttuanti, a richiesta per carichi molto sporadici su istanze piccole e statico per i picchi costantemente elevati quando CPU e RAM sono chiaramente riservate. Attivo anche Opcache con memoria sufficiente e riconvalidare gli script in modo efficiente, in modo che i lavoratori necessitino di meno CPU per richiesta. Con timeout_richiesta_slowlog e slowlog Trovo i punti caldi nel codice senza allargare il pool. Verifico se il socket FPM come socket Unix oppure TCP è connesso; localmente preferisco i socket, via container/host spesso TCP.
Lista di controllo per negozi, iscrizioni e LMS
Per i negozi considero la dinamica Pagine come il carrello, il checkout e "Il mio account" e ridurre le chiamate esterne. Nelle aree riservate ai membri, controllo che ogni query del profilo e della dashboard non sia superflua. Nell'LMS, mi affido alla cache degli oggetti per gli elenchi dei corsi, mentre rendo efficienti gli indicatori di progresso. In tutti i casi, miro a poche e brevi richieste per azione, in modo che i lavoratori si liberino rapidamente. Solo quando questi compiti sono stati completati, estendo i lavoratori e CPU parallelo.
Sessioni, locking e trappole per la concorrenza
Presto attenzione ai blocchi di sessione, che in PHP funzionano in modo seriale per sessione utente per impostazione predefinita. Se azioni costose (ad esempio, callback di pagamento) vengono eseguite durante la stessa sessione, questo blocca ulteriori richieste da parte di questo utente, con conseguenti picchi in TTFB e gli impedimenti percepiti. Riduco al minimo l'uso delle sessioni, memorizzo solo l'essenziale nelle sessioni e passo a gestori ad alte prestazioni (ad esempio, in-memory). In WooCommerce, faccio attenzione alle sessioni e alle tempeste transitorie nel carrello.
Database e servizi esterni come moltiplicatori
Spesso lento Query SQL o i limiti di velocità delle API esterne influenzano il worker. Ottimizzo gli indici, riduco le query N+1, imposto cache di query (cache di oggetti) e limito le chiamate esterne con timeout e logica di retry. Se i server di pagamento, di spedizione o di licenza diventano lenti, limito deliberatamente il parallelismo su questi percorsi in modo che l'intero pool non sia in attesa. In questo modo si lasciano spazi liberi per altre azioni dell'utente.
Selezione del fornitore e messa a punto dell'hosting in vista dei lavoratori
Preferisco i piani di hosting in cui posso Lavoratori PHP in modo flessibile ed espandere i core della CPU in parallelo. I fornitori ad alte prestazioni offrono livelli di caching puliti, storage NVMe veloce e metriche chiare nel pannello. Come introduzione alla valutazione tecnica, il Guida all'hosting PHPche rende tangibili i criteri e le opzioni centrali. Per me è importante che il supporto non venga interrotto durante i picchi di traffico, ma che la capacità sia disponibile senza riavvio. È così che mantengo TTFB, tasso di errore e Produttività in equilibrio.
Pianificazione dei picchi e protezione dai carichi bot
Sono d'accordo su un percorso di escalation in anticipo: quanto velocemente i lavoratori e i CPU chi controlla quali timeout sono autorizzati a crescere temporaneamente? Allo stesso tempo, riduco al minimo i carichi di bot e spam attraverso limiti di velocità ragionevoli sugli endpoint dinamici. Ogni richiesta non necessaria che viene respinta è uno slot di lavoro libero per i clienti reali.
Per togliere
Lavoratori PHP decidere la rapidità con cui le pagine dinamiche reagiscono sotto carico, perché ogni processo gestisce solo una richiesta alla volta. Riduco al minimo il carico con una cache coerente, elimino i plugin bloccanti e stabilisco un rapporto ragionevole tra lavoratori e CPU. Nei momenti di picco, aumento con attenzione i lavoratori e verifico se la coda scompare e il TTFB si riduce. I registri, lo stato di FPM e i test di carico mi forniscono le prove per capire se sto scalando correttamente o se ho bisogno di ridurre i timeout. Se avete queste leve sotto controllo, eviterete i colli di bottiglia, proteggerete le transazioni e garantirete tempi di elaborazione sensibilmente più rapidi. Esperienza dell'utente.


