Διόρθωση του σφάλματος "Allowed Memory Size Exhausted" στο WordPress
Αν ο ιστότοπός σας εμφανίζει Fatal error: Allowed memory size of 268435456 bytes exhausted, προσθέστε αυτή τη γραμμή στο wp-config.php πάνω από το / That's all, stop editing! /
Δημοσιεύτηκε
Αν ο ιστότοπός σας εμφανίζει Fatal error: Allowed memory size of 268435456 bytes exhausted, προσθέστε αυτή τη γραμμή στο wp-config.php πάνω από το σχόλιο /* That's all, stop editing! */: define( 'WP_MEMORY_LIMIT', '256M' );. Έτσι οι περισσότεροι ιστότοποι επανέρχονται online σε λιγότερο από ένα λεπτό. Διαβάστε όμως την υπόλοιπη σελίδα πριν φύγετε, γιατί η αύξηση του ορίου είναι διαγνωστικό εργαλείο, όχι θεραπεία. Αν το crash επανεμφανιστεί σε μεγαλύτερο νούμερο, το πραγματικό πρόβλημα είναι κώδικας που καταναλώνει μνήμη χωρίς όριο, και μια πιο ψηλή οροφή απλώς του δίνει περισσότερο περιθώριο να το κάνει.
Τι σημαίνει πραγματικά το σφάλμα
Η PHP παρακολουθεί πόση μνήμη έχει δεσμεύσει το κάθε αίτημα. Όταν ένα μεμονωμένο αίτημα προσπαθήσει να δεσμεύσει μνήμη πέρα από το memory_limit που ορίζεται στο php.ini (ή που το παρακάμπτει το WordPress), η PHP τερματίζει αμέσως το αίτημα με fatal error και τυπώνει το πλήθος των bytes στο οποίο «πέθανε». Τα 268435456 bytes είναι 256M. Τα 134217728 είναι 128M. Τα 536870912 είναι 512M. Το νούμερο μετά το «tried to allocate» σας λέει το μέγεθος της τελευταίας σταγόνας, όχι το μέγεθος του προβλήματος.
Το WordPress προσθέτει τα δικά του όρια πάνω από αυτά της PHP. Το WP_MEMORY_LIMIT (προεπιλογή 40M, ή το όριο της PHP αν είναι μεγαλύτερο) διέπει το front end. Το WP_MAX_MEMORY_LIMIT (προεπιλογή 256M) διέπει τις λειτουργίες της διαχείρισης, όπως η βιβλιοθήκη πολυμέσων και οι ενημερώσεις προσθέτων, που δικαιολογημένα χρειάζονται περισσότερη. Το WordPress καλεί την ini_set('memory_limit', ...) κατά τη φόρτωση με βάση αυτές τις σταθερές — αλλά μόνο αν ο πάροχός σας επιτρέπει την ini_set, και μόνο μέχρι το απόλυτο όριο που θέτει ο πάροχος. Αυτό το τελευταίο κομμάτι είναι ο λόγος που η επεξεργασία του wp-config.php μερικές φορές φαίνεται να μην κάνει τίποτα.
Διορθώστε το, με τη σειρά
1. Αυξήστε το όριο του WordPress στο wp-config.php. Αυτό είναι το πρώτο που πρέπει να δοκιμάσετε, γιατί είναι αναστρέψιμο και δεν αγγίζει τίποτα άλλο.
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
Αν δεν είστε σίγουροι πού μπαίνουν αυτές οι γραμμές ή θέλετε να οριστούν σωστά ταυτόχρονα και οι άλλες συνηθισμένες σταθερές, η γεννήτρια wp-config γράφει ένα καθαρό μπλοκ που μπορείτε να επικολλήσετε. Η θέση έχει σημασία — οτιδήποτε κάτω από τη γραμμή «stop editing» αγνοείται.
2. Αν αυτό δεν κάνει τίποτα, ο πάροχός σας βάζει όριο στην PHP. Αυξήστε το memory_limit σε επίπεδο PHP. Στο php.ini:
memory_limit = 256M
Σε πολλούς shared παρόχους δεν μπορείτε να επεξεργαστείτε απευθείας το php.ini. Δοκιμάστε αντ’ αυτού ένα αρχείο .user.ini στη ρίζα του ιστότοπού σας, ή ορίστε το μέσω .htaccess σε στήσιμο Apache/mod_php:
php_value memory_limit 256M
Σημειώστε ότι το php_value στο .htaccess προκαλεί σφάλμα 500 σε nginx ή σε στήσιμο PHP-FPM, επειδή πρόκειται για οδηγία Apache/mod_php. Αν πάρετε 500 αφού το προσθέσετε, αυτός είναι ο λόγος — αφαιρέστε το και χρησιμοποιήστε .user.ini.
3. Επιβεβαιώστε την τιμή που ισχύει πραγματικά. Μην εμπιστεύεστε αυτό που επεξεργαστήκατε· εμπιστευτείτε αυτό που αναφέρει η PHP. Ρίξτε ένα αρχείο μίας γραμμής στη ρίζα του ιστότοπού σας:
<?php echo ini_get('memory_limit');
Φορτώστε το σε έναν browser, διαβάστε την τιμή και μετά διαγράψτε το αρχείο. Αν εξακολουθεί να λέει 128M αφού ορίσατε 256M, ο πάροχός σας σας παρακάμπτει και πρέπει να επικοινωνήσετε μαζί του ή να χρησιμοποιήσετε τη ρύθμιση του control panel του.
Το κομμάτι που παραλείπουν οι περισσότεροι οδηγοί
Η αύξηση του ορίου είναι διάγνωση. Δείτε πώς να διαβάσετε το αποτέλεσμα.
Αν ορίσετε 256M και ο ιστότοπος μένει σταθερός υπό κανονική κίνηση, είχατε μια θεμιτή οροφή που ήταν πολύ χαμηλή — συνηθισμένο σε ιστότοπους με μεγάλες βιβλιοθήκες πολυμέσων, WooCommerce ή page builders. Τελειώσατε.
Αν ορίσετε 256M και ξανακρασάρει, μετά 512M και ξανακρασάρει, σταματήστε να το αυξάνετε. Ένα κανονικό αίτημα WordPress δεν χρειάζεται 512M. Όταν η χρήση μνήμης ανεβαίνει χωρίς οροφή, κάτι κάνει loop ή συσσωρεύει: ένα πρόσθετο που φορτώνει έναν ολόκληρο πίνακα της βάσης σε έναν πίνακα (array), ένα add_action που πυροδοτεί αναδρομικά τον εαυτό του, μια ρουτίνα εισαγωγής που κρατά κάθε γραμμή στη μνήμη ταυτόχρονα, ή δύο πρόσθετα που συγκρούονται μέσα στο ίδιο hook. Η αύξηση του ορίου δεν διορθώνει ένα loop χωρίς όριο — απλώς μεταθέτει το crash λίγα δευτερόλεπτα αργότερα και το κάνει πιο δύσκολο να αναπαραχθεί.
Για να βρείτε τον υπαίτιο, απενεργοποιήστε όλα τα πρόσθετα και αλλάξτε σε ένα προεπιλεγμένο θέμα όπως το Twenty Twenty-Four. Αν το σφάλμα σταματήσει, ενεργοποιήστε τα ξανά ένα-ένα μέχρι να επανεμφανιστεί. Ενεργοποιήστε το debug log για να πιάσετε πού «πεθαίνει»:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
Η γραμμή του fatal error στο wp-content/debug.log κατονομάζει το αρχείο και τον αριθμό γραμμής που δέσμευσε το τελευταίο κομμάτι. Αυτό συνήθως είναι το loop, ή μία κλήση συνάρτησης μακριά από αυτό.
Τι να μην κάνετε
Μην ορίζετε το WP_MEMORY_LIMIT σε -1 ή 1024M και μην το ξεχνάτε. Η απεριόριστη μνήμη δεν διορθώνει μια διαρροή· αφήνει ένα ξεφύγει αίτημα να «φάει» ολόκληρο τον server, κάτι που μπορεί να ρίξει κάθε άλλον ιστότοπο στο ίδιο μηχάνημα και να σας φέρει ένα τηλεφώνημα από τον πάροχό σας. Η οροφή είναι χαρακτηριστικό ασφαλείας. Κρατήστε μία.
Μην επικολλάτε το ini_set('memory_limit', '512M') στο functions.php ως κύρια λύση. Εκτελείται πολύ αργά για κάποιες αστοχίες — αν το crash συμβεί κατά τη φόρτωση του πυρήνα του WordPress, πριν εκτελεστεί το functions.php του θέματός σας, η γραμμή δεν τρέχει ποτέ. Το wp-config.php φορτώνει νωρίτερα και είναι το σωστό μέρος.
Μην υποθέτετε ότι είναι πρόβλημα του hosting και μην αναβαθμίζετε το πακέτο σας. Μερικές φορές πρόκειται όντως για υποδιαστασιολογημένο hosting. Συχνά όμως ακριβώς το ίδιο crash σας ακολουθεί στο μεγαλύτερο πακέτο, επειδή η αιτία ταξίδεψε μαζί μέσα στα πρόσθετά σας. Αποκλείστε πρώτα το loop· είναι δωρεάν.
Μην αυξάνετε το memory_limit για να διορθώσετε ένα σφάλμα max_execution_time. Πρόκειται για διαφορετικά όρια με διαφορετικά μηνύματα. Η εξάντληση μνήμης λέει «Allowed memory size … exhausted». Ένα timeout λέει «Maximum execution time … exceeded». Αν αυξήσετε το λάθος, θα χάσετε ένα ολόκληρο απόγευμα.
Ακόμα κολλημένοι;
Αν έχετε επιβεβαιώσει ότι το ζωντανό όριο είναι πραγματικά 256M ή περισσότερο, το δοκιμάσατε με όλα τα πρόσθετα κλειστά και ένα προεπιλεγμένο θέμα, και εξακολουθεί να εξαντλεί τη μνήμη, τότε έχετε μια πραγματική διαρροή που αξίζει να κυνηγήσετε στο debug log, όχι μια οροφή που αξίζει να ανεβάσετε. Καταγράψτε τη γραμμή του fatal error, σημειώστε σε ποιου προσθέτου τον κατάλογο δείχνει, και αυτό είναι το bug report σας. Ρυθμίστε πρώτα σωστά τις βασικές σταθερές του wp-config.php με τη γεννήτρια wp-config, ώστε να ξέρετε ότι τα όρια είναι ορισμένα εκεί που νομίζετε — και μετά πηγαίνετε να διαβάσετε το log.