Questo messaggio vuol dire che una singola richiesta PHP ha provato a tenere in memoria più di quanto le sia concesso. Il limite è per richiesta, non per server: un limite di 256M non significa che il server abbia 256M.

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted

134217728 sono 128M. Il numero nel messaggio è sempre il limite in vigore, quindi non deve mai andarlo a cercare.

Dove alzarlo

  • EGPNL - le impostazioni PHP del sito, ed è il posto giusto perché sopravvive agli aggiornamenti.
  • php.ini - memory_limit = 256M, per l'intero pool.
  • wp-config.php - define("WP_MEMORY_LIMIT", "256M"); per il solo WordPress.
Un limite oltre i 512M quasi sempre sta nascondendo un bug. Leggere un'intera tabella dentro un array, o un intero file invece di scorrerlo a flusso, va corretto e non nutrito.

Trovi che cosa se la sta mangiando

echo round(memory_get_peak_usage(true)/1048576, 1) . ' MB';

Metta quello in fondo alla pagina lenta e le stampa il picco. Poi proceda per bisezione: commenti metà del lavoro e guardi quale metà il picco segue.

Le due cause solite

  • Una query senza freno. Una SELECT senza LIMIT su una tabella che è cresciuta. La scorra a pagine.
  • Una libreria di immagini su un file grande. Una fotografia da 6000 px costa in memoria molto più di quanto la dimensione del file lasci pensare, perché una volta caricata è decompressa.
Un cron che fallisce a 128M e funziona a 512M non è stato riparato. Fallirà di nuovo quando i dati saranno cresciuti, alle tre di notte.