Napaka „Allowed memory size exhausted”: povečanje omejitve pomnilnika PHP

WordPress Branje: 5 min

Usodno napako „Allowed memory size of 268435456 bytes exhausted” PHP vrne, ko bi ena sama zahteva zahtevala več pomnilnika, kot ga dovoljuje nastavitev memory_limit. Zahteva se takoj ustavi: obiskovalec vidi prazno stran ali sporočilo „Na tej spletni strani je prišlo do kritične napake.”, nalaganje ali posodobitev pa ostane nedokončana.

Rešitev ima dva koraka: povečaj omejitev na ravni, ki velja za tvoje spletno mesto, in poglej, ali napake ne povzroča podivjan vtičnik ali obdelava slik. V slednjem primeru višja omejitev le odloži naslednji izpad.

Kaj pove sporočilo o napaki?

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: omejitev v bajtih. Za pretvorbo v MB deli z 1 048 576: 134217728 = 128 MB, 268435456 = 256 MB, 536870912 = 512 MB.
  • tried to allocate 20480 bytes: tista ena dodelitev, ki ni šla več vanjo, ne celotna potreba zahteve. Če je ta majhna, je bila zahteva že na stropu.
  • in … on line …: koda, ki je zahtevala pomnilnik. Če kaže na mapo vtičnika (wp-content/plugins/<ime>/), je ta osumljenec. Če kaže na jedro WordPressa (wp-includes), je to le izvajalec; kako iskati pravi vzrok, pokažemo spodaj.

Na strežnikih cPanel aWh PHP napake zapisuje v datoteko logs/php.error.log domačega imenika:

grep -h "Allowed memory size" ~/logs/php.error.log ~/public_html/error_log 2>/dev/null | tail -n 3

Tri omejitve, ugnezdene druga v drugo

Infografika: fizični pomnilnik CloudLinux, memory_limit PHP in WP_MEMORY_LIMIT WordPress, ugnezdeni drug v drugega

  1. Fizični pomnilnik računa (CloudLinux PMEM). Je del paketa gostovanja cPanel in velja skupaj za vse procese računa: za vse hkrati tekoče zahteve PHP, opravila cron, SSH. Vrednosti navaja članek o omejitvah virov paketov.
  2. memory_limit PHP. Zgornja meja ene zahteve PHP. V cPanelu jo nastaviš v vmesniku Select PHP Version.
  3. Konstanti WordPress WP_MEMORY_LIMIT in WP_MAX_MEMORY_LIMIT v datoteki wp-config.php. WordPress z njima omejitev PHP lahko le poviša, ne zniža, in ne more preseči memory_limit PHP. Če nista navedeni, je osnovna vrednost za strani za obiskovalce 40 MB, za skrbniški vmesnik in urejanje slik pa 256 MB, če pa je omejitev PHP višja, ostane v veljavi višja.

Od teh treh napako „Allowed memory size” vedno sproži memory_limit. Če se napolni fizični pomnilnik računa, je simptom drugačen (glej spodaj) in tam povečanje memory_limit stanje poslabša.

1. Poglej veljavno omejitev

Najpreprosteje v skrbniškem vmesniku: Orodja › Zdravje spletišča › Podatki, v razdelku Strežnik vrstica Omejitev pomnilnika PHP. Vrednosti WP_MEMORY_LIMIT in WP_MAX_MEMORY_LIMIT sta vidni na istem mestu, v razdelku Konstante WordPress.

Ukazna vrstica tu ne pomaga, ker PHP za ukazno vrstico na strežnikih aWh nima omejitve pomnilnika (vrednost wp eval 'echo ini_get("memory_limit");' je -1, torej neomejeno). Spletno vrednost poizveš z začasno datoteko, ki jo nato takoj izbrišeš:

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. Povečaj vrednost memory_limit

  1. Prijavi se v cPanel in v skupini Programska oprema klikni ikono Select PHP Version.
  2. Klikni zavihek Možnosti.
  3. V vrstici memory_limit na seznamu izberi večjo vrednost. Sprememba se shrani samodejno in velja od naslednje zahteve.

Select PHP Version, zavihek Možnosti: možnosti PHP, med njimi memory_limit

Nastavitev velja za vsa spletna mesta računa, ki uporabljajo določeno različico PHP. Podrobneje jo opisuje članek o upravljanju razširitev in nastavitev PHP. Za eno mapo lahko drugačno vrednost navedeš z datoteko .user.ini (uporaba .user.ini); PHP to datoteko predpomni največ 5 minut, zato lahko sprememba začne veljati z zamikom.

Za mapo lahko vrednost navedeš tudi z vrstico php_value memory_limit 256M datoteke .htaccess; na naših strežnikih tudi to deluje. Nastavitev imej na enem mestu, ker je, če Select PHP Version, .user.ini in .htaccess pravijo vsak svoje, težko ugotoviti, katera velja.

3. Konstante WordPress

Če je omejitev PHP dovolj visoka, konstante WordPress običajno niso potrebne. Če jih vtičnik izrecno zahteva ali stran Zdravje spletišča kaže nizko vrednost, jih nastavi:

cd ~/public_html
wp config set WP_MEMORY_LIMIT 256M
wp config set WP_MAX_MEMORY_LIMIT 512M

Pri ročnem urejanju morata biti vrstici define() nad komentarjem /* That's all, stop editing! */. Če se tudi po nastavitvi nič ne spremeni, je memory_limit PHP nižji ali ga vtičnik pozneje prepiše: grep -rn "memory_limit" ~/public_html/wp-content --include=*.php.

4. Je res težava v omejitvi?

Povprečna stran WordPress teče tudi z nekaj deset MB pomnilnika. Če zahtevi ni dovolj niti 512 MB, nekaj deluje narobe in večja omejitev da le odlog do naslednje napake. Vzrok išči takole:

  • Pot v sporočilu o napaki. Če kaže na mapo vtičnika, je ta osumljenec. Če kaže na jedro WordPressa, namesti vtičnik Query Monitor, ki za vsako zahtevo pokaže največjo porabo pomnilnika, in odpri napačno stran.
  • Metoda izločanja. Shrani seznam aktivnih vtičnikov, izklopi vse, ponovi napako, nato jih vklapljaj po skupinah, dokler se napaka ne vrne (to je dobro delati na testni kopiji (staging)):
wp plugin list --status=active --field=name > ~/aktiv-bovitmenyek.txt
wp plugin deactivate --all
# ... preverjanje napake, nato ponovni vklop:
wp plugin activate $(cat ~/aktiv-bovitmenyek.txt)
  • Obdelava slik. Če napaka nastane v datoteki class-wp-image-editor-gd.php, pomnilnik porabi spreminjanje velikosti velike fotografije. GD razpakirano sliko v pomnilniku hrani s približno 4 bajti na slikovno točko, zato je 24-megapikselna fotografija že pred sličicami pribl. 100 MB. Slike pred nalaganjem pomanjšaj ali sličice obstoječih znova ustvari iz ukazne vrstice, kjer ni omejitve pomnilnika: wp media regenerate --yes. V vmesniku Select PHP Version lahko vklopiš tudi razširitev imagick, WordPress pa namesto GD izbere to.
  • Množična opravila. Uvoz izdelkov ali velik izvoz naročil naj ne teče v brskalniku. Zaženi ga z WP-CLI ali v načinu vtičnika v ozadju, tako ni treba vsaki spletni zahtevi dati velike omejitve.

Če napaka ni „Allowed memory size”

Če je v dnevniku Out of memory ali obiskovalec dobi napako 503 oziroma stran „508 Resource Limit Is Reached”, ni ene zahteve, temveč je celoten račun dosegel fizični pomnilnik ali omejitev hkratnih procesov paketa. Takrat povečanje memory_limit stanje poslabša, ker lahko vsaka zahteva zasede večji del skupnega okvira. V skupini Meritve v cPanelu poglej stran Resource Usage (števci napak), poišči, kaj obremenjuje račun, in če je spletno mesto paket preprosto preraslo, preidi na večjega. O napaki 508 govori ločen članek.

Če spletno mesto vrne prazno stran, v nobenem dnevniku pa ni napake pomnilnika, pomaga članek o belem zaslonu.

Nazaj: WordPress – članki (45)