Az „Allowed memory size of 268435456 bytes exhausted” végzetes hibát a PHP akkor adja, amikor egyetlen kérés több memóriát kérne, mint amennyit a memory_limit beállítás enged. A kérés azonnal leáll: a látogató üres oldalt vagy a „Súlyos hiba történt a webhelyünkön.” üzenetet látja, egy feltöltés vagy frissítés pedig félbemarad.
A megoldás két lépés: emelje a korlátot azon a szinten, amelyik a webhelyére érvényes, és nézze meg, nem egy elszabadult bővítmény vagy képfeldolgozás okozza-e a hibát. Ez utóbbi esetben a magasabb korlát csak elodázza a következő leállást.
Mit mond a hibaüzenet?
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes) in /home/felhasznalonev/public_html/wp-includes/class-wp-image-editor-gd.php on line 118
Allowed memory size of 268435456 bytes: a korlát bájtban. MB-ra váltáshoz ossza el 1 048 576-tal: 134217728 = 128 MB, 268435456 = 256 MB, 536870912 = 512 MB.tried to allocate 20480 bytes: az az egy foglalás, amely már nem fért bele, nem a kérés teljes igénye. Ha ez kicsi, a kérés már a plafonon járt.in … on line …: az a kód, amely a memóriát kérte. Ha egy bővítmény mappájára mutat (wp-content/plugins/<név>/), az a gyanúsított. Ha a WordPress magjára (wp-includes), az csak a végrehajtó; a valódi okot lejjebb mutatjuk meg, hogyan keresse.
Az aWh cPanel szerverein a PHP a hibákat a home könyvtár logs/php.error.log fájljába írja:
grep -h "Allowed memory size" ~/logs/php.error.log ~/public_html/error_log 2>/dev/null | tail -n 3
Három korlát, egymásba ágyazva
- A fiók fizikai memóriája (CloudLinux PMEM). A cPanel tárhely csomag része, és a fiók összes folyamatára együtt vonatkozik: minden egyszerre futó PHP-kérésre, a cron-feladatokra, az SSH-ra. Az értékeket a csomagok erőforráslimitjeiről szóló cikk sorolja fel.
- A PHP
memory_limit. Egyetlen PHP-kérés felső határa. cPanelben a Select PHP Version felületén állítható. - A WordPress
WP_MEMORY_LIMITésWP_MAX_MEMORY_LIMITállandói awp-config.phpfájlban. A WordPress ezekkel csak emelni tudja a PHP korlátját, csökkenteni nem, és a PHPmemory_limitfölé nem mehet. Ha nincsenek megadva, a látogatói oldalakra 40 MB, az admin felületre és a képszerkesztésre 256 MB az alapérték, de ha a PHP korlátja ennél magasabb, a magasabb marad érvényben.
A három közül az „Allowed memory size” hibát mindig a memory_limit adja. Ha a fiók fizikai memóriája telik be, más a tünet (lásd lent), és ott a memory_limit emelése ront a helyzeten.
1. Nézze meg az érvényes korlátot
A legegyszerűbb az admin felületen: Eszközök › Webhely Egészség › Információ, a Kiszolgáló részben a PHP memória korlát sor. A WP_MEMORY_LIMIT és a WP_MAX_MEMORY_LIMIT értéke ugyanott, a WordPress konstansok részben látszik.
A parancssor itt nem segít, mert a parancssori PHP-nek az aWh szerverein nincs memóriakorlátja (a wp eval 'echo ini_get("memory_limit");' értéke -1, azaz korlátlan). A webes értéket egy ideiglenes fájllal kérdezheti le, amelyet utána azonnal töröl:
echo '<?php echo ini_get("memory_limit"), PHP_EOL;' > ~/public_html/memteszt-7f3k.php
curl -s https://pelda.hu/memteszt-7f3k.php
rm ~/public_html/memteszt-7f3k.php
2. Emelje a memory_limit értékét
- Jelentkezzen be a cPanelbe, és a Szoftver csoportban kattintson a Select PHP Version ikonra.
- Kattintson a Beállítások fülre.
- A
memory_limitsorban válasszon nagyobb értéket a listából. A változás automatikusan mentődik, és a következő kéréstől érvényes.
A beállítás a fiók összes webhelyére vonatkozik, amely az adott PHP-verziót használja. Részletesebben a PHP-bővítmények és -beállítások kezeléséről szóló cikk írja le. Egyetlen mappára a .user.ini fájllal adhat meg eltérő értéket (a .user.ini használata); a PHP ezt a fájlt legfeljebb 5 percig gyorsítótárazza, ezért a változás késve is érvénybe léphet.
Egy mappára a .htaccess fájl php_value memory_limit 256M sorával is megadhatja az értéket; a szervereinken ez is működik. Egy helyen tartsa a beállítást, mert ha a Select PHP Version, a .user.ini és a .htaccess mást mond, nehéz kideríteni, melyik érvényes.
3. A WordPress állandói
Ha a PHP korlátja elég magas, a WordPress állandóira általában nincs szükség. Ha egy bővítmény kifejezetten kéri, vagy a Webhely Egészség oldal alacsony értéket mutat, állítsa be őket:
cd ~/public_html
wp config set WP_MEMORY_LIMIT 256M
wp config set WP_MAX_MEMORY_LIMIT 512M
Kézi szerkesztésnél a két define() sornak a /* That's all, stop editing! */ megjegyzés fölött kell lennie. Ha a beállítás után sem változik semmi, a PHP memory_limit alacsonyabb, vagy egy bővítmény később felülírja: grep -rn "memory_limit" ~/public_html/wp-content --include=*.php.
4. Valóban a korlát a baj?
Egy átlagos WordPress-oldal néhány tíz MB memóriával is elfut. Ha egy kérésnek 512 MB sem elég, valami rosszul működik, és a nagyobb korlát csak a következő hibáig ad haladékot. Így keresse az okot:
- A hibaüzenet útvonala. Ha egy bővítmény mappájára mutat, az a gyanúsított. Ha a WordPress magjára, telepítse a Query Monitor bővítményt, amely kérésenként mutatja a csúcsmemóriát, és nyissa meg a hibás oldalt.
- Kizárásos módszer. Mentse el az aktív bővítmények listáját, kapcsolja ki mindet, ismételje meg a hibát, majd kapcsolja vissza őket csoportonként, amíg a hiba vissza nem tér (érdemes staging másolaton végezni):
wp plugin list --status=active --field=name > ~/aktiv-bovitmenyek.txt
wp plugin deactivate --all
# ... a hiba ellenőrzése, majd a visszakapcsolás:
wp plugin activate $(cat ~/aktiv-bovitmenyek.txt)
- Képfeldolgozás. Ha a hiba a
class-wp-image-editor-gd.phpfájlban keletkezik, egy nagy fénykép átméretezése fogyasztja el a memóriát. A GD a kicsomagolt képet pixelenként nagyjából 4 bájton tartja a memóriában, így egy 24 megapixeles fotó már a bélyegképek előtt kb. 100 MB. Méretezze kisebbre a képeket feltöltés előtt, vagy a meglévők bélyegképeit generálja újra parancssorból, ahol nincs memóriakorlát:wp media regenerate --yes. A Select PHP Version felületen azimagickbővítményt is bekapcsolhatja, a WordPress ezt választja a GD helyett. - Tömeges feladatok. Egy termékimport vagy egy nagy rendelésexport ne a böngészőben fusson. Futtassa WP-CLI-vel vagy a bővítmény háttérmódjával, így nem kell minden webes kérésnek nagy korlátot adni.
Ha nem az „Allowed memory size” a hiba
Ha a naplóban Out of memory áll, vagy a látogató 503-as hibát, illetve a „508 Resource Limit Is Reached” oldalt kapja, nem egy kérés, hanem a teljes fiók érte el a csomag fizikai memóriáját vagy egyidejű folyamatkorlátját. Ilyenkor a memory_limit emelése ront a helyzeten, mert minden kérés nagyobb részt foglalhat el a közös keretből. Nézze meg a cPanel Mutató csoportjában a Resource Usage oldalt (hibaszámlálók), keresse meg, mi terheli a fiókot, és ha a webhely egyszerűen kinőtte a csomagot, váltson nagyobbra. Az 508-as hibáról külön cikk szól.
Ha a webhely üres oldalt ad, de egyik naplóban sincs memóriahiba, a fehér képernyőről szóló cikk segít.

