Gli errori 500 non erano nel codice

Un e-commerce WooCommerce di circa 2.400 prodotti carica ogni giorno il catalogo dal gestionale aziendale. Sull’hosting condiviso 101 chiamate dell’import su 207 finivano in errore HTTP 500. La lettura ovvia era un difetto nel codice dell’import.
Invece di cominciare a correggere, ho incrociato quattro log di livelli diversi dello stack. Dicevano una cosa che nessun log applicativo avrebbe mostrato: i processi PHP venivano uccisi dall’esterno, 13 in 70 secondi, e la cache del codice PHP era piena e non configurabile su quel piano. Il codice non falliva, la piattaforma lo terminava. Il fornitore ha confermato che i limiti non si potevano cambiare.
Quella prova ha cambiato la decisione. Senza, le settimane successive sarebbero andate in altre modifiche al codice per un problema che il codice non aveva. Con quella prova la domanda è diventata se restare su una piattaforma con un tetto documentato, e la risposta è stata un server dedicato.
Prima di decidere ho misurato quanto della lentezza dipendeva dalla piattaforma. Un profilo PHP ha mostrato lo stesso codice da 4 a 5 volte più lento sull’hosting condiviso che in locale. Due funzioni sono passate da 58,5 a 0,5 ms con HTML identico. Un’ottimizzazione consigliata ovunque, l’aggregazione dei CSS, è stata provata e scartata perché non migliorava le metriche. Sapere quale ritocco non serve fa parte del risultato.
La migrazione è stata trattata come un progetto di affidabilità, non come una copia: sedici script numerati e idempotenti provati in container e verificati con checksum, il nuovo server isolato fino al passaggio, 1.815.094 record controllati uno per uno su 139 tabelle e 413.586 file, rollback del DNS provato, passaggio a negozio chiuso con il vecchio hosting intatto, prova finale con un ordine reale.
Risultato all’origine, media di 10 pagine: TTFB da 954 a 636 ms su desktop (-33%) e da 1.027 a 647 ms su mobile (-37%). Import sul nuovo server: 188 record in 2 minuti e 20 secondi, nessun processo interrotto.
Perché conta
Il lavoro sull’affidabilità comincia spesso da un’attribuzione sbagliata: l’errore è nell’applicazione, quindi si corregge l’applicazione. Qui l’errore era nel livello sotto, e l’unico modo per vederlo era leggere insieme log di livelli diversi.
Limiti
In questa fase nessun test di carico sull’hosting condiviso: il contratto chiedeva un’autorizzazione scritta che l’incarico non prevedeva. Misure di laboratorio sull’origine, scavalcando la cache della CDN, non dati di campo. Il dato sull’import è un’esecuzione osservata, non una serie statistica.
Caso anonimizzato su richiesta del cliente.