Na kratko: memory_limit določa, koliko pomnilnika sme zasesti posamezna zahteva PHP; privzeto je 128M. V običajnem delovanju nastavite končno vrednost, ki ustreza aplikaciji, in jo zaklenite s php_admin_value. Dokler PHP2Shell ni popravljen, php.net začasno svetuje memory_limit=-1, ki ga ni mogoče prepisati in je združen z mejo prek vsebnika ali cgroup, ne prek RLIMIT_AS ali RLIMIT_DATA. Po posodobitvi spet velja končna vrednost.
Rutinska nastavitev, ki je nenadoma varnostna tema
Leta je bil memory_limit vijak za razvijalce. Če spletna stran javi »Allowed memory size exhausted«, se vrednost poveča in težava je rešena. S PHP2Shell je to postalo varnostno vprašanje, priporočilo php.net pa je na prvi pogled paradoksalno: za prehod naj lastna pomnilniška meja PHP v celoti odpade.
Ozadje je CVE-2026-109618. Po projektu PHP lahko stanje brez pomnilnika (out-of-memory) prekine PHP, medtem ko so podatki zahteve inicializirani le delno. Čiščenje zahteve potem lahko neveljavne podatke obravnava kot veljavne. Tehnične podrobnosti so pod CVE-2026-109618, kaj se ob pomanjkanju pomnilnika dogaja v notranjosti PHP, pojasnjuje memory_limit in out-of-memory. Za upravljavce šteje vprašanje: katera vrednost velja kdaj in kje mora biti zapisana?
Kaj memory_limit počne v običajnem delovanju
Po priročniku PHP memory_limit omejuje pomnilnik, ki ga sme skript zasesti, in tako strežnik varuje pred slabo napisano kodo. Privzeto je 128M, -1 pomeni brez meje. Dovoljeni so skrajšani zapisi, kot sta 256M ali 1G.
Dve lastnosti sta pomembni za varnost. Prvič, vrednost je mogoče spremeniti povsod, tudi med izvajanjem z ini_set(). Številni CMS in trgovine jo sami povečajo, na primer za uvoze ali obdelavo slik. Kdor želi vrednost prisiliti, jo mora nastaviti s php_admin_value; po priročniku tako nastavljenih vrednosti ni mogoče prepisati z ini_set(). Drugič, priročnik priporoča, da je memory_limit večji od post_max_size.
Katera vrednost ustreza, je odvisno od aplikacije. Pogled v dnevnik napak pokaže, ali se pojavljajo sporočila o izčrpanem pomnilniku in ob katerih klicih. Obneslo se je, da se vrednost določi za vsako spletno stran v lastnem poolu FPM: radodarneje za trgovino z uvozi, skromneje za preprosto podjetniško stran. Splošno zelo visoka vrednost za vse spletne strani zapravi zaščitni učinek, ker lahko ena sama napačna ali zlorabljena zahteva veže veliko pomnilnika.
Od PHP 8.5 obstaja dodatno max_memory_limit. To nastavitev je mogoče nastaviti samo ob zagonu in omejuje, kako visoko sme biti memory_limit sploh nastavljen. Višje vrednosti se z opozorilom odrežejo. Privzeto -1 pomeni brez zgornje meje.
memory_limit po PHP2Shell: prehodni ukrep php.net
Za strežnike, ki še niso posodobljeni na 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma na potrjen backport, php.net v varnostnem obvestilu z dne 21. 10. 2026 navaja naslednje korake. Zmanjšajo tveganje posameznih poti napada, vendar namestitve po php.net ne naredijo varne:
- Nastavite
memory_limit=-1, po možnosti tako, da aplikacije vrednosti ne morejo prepisati, na primer sphp_admin_valuev poolu FPM ali v konfiguraciji Apache. - Preverite, da se nikjer znova ne nastavi končna meja, ne v drugem poolu, ne v konfiguraciji imenika in ne v aplikaciji.
- Nastavite pomnilniško mejo prek vsebnika ali cgroup, kot zaščito razpoložljivosti, po možnosti tako, da se ob prekoračitvi konča samo prizadeti delavec.
- Ne uporabljajte
RLIMIT_ASaliRLIMIT_DATA. Ti meji lahko po php.net sprožita prav ranljivo napako pri zahtevi za pomnilnik.
php.net v zvezi s tem pojasnjuje, da -1 odstrani ciljno sprožljiv doseg pomnilniške meje PHP, da pa napaka pomnilnika na nižji ravni ranljivo pot še vedno lahko doseže. Pregled vseh prehodnih ukrepov je pod Takojšnji ukrepi, če popravka še ne morete namestiti.
; Pool FPM, npr. /etc/php/8.3/fpm/pool.d/www.conf (samo do posodobitve)
php_admin_value[memory_limit] = -1
# Kje vse je nastavljen memory_limit (samo bralno)
grep -rn 'memory_limit' /etc/php/ /etc/apache2/ 2>/dev/null
grep -rn --include='*.php' -E "ini_set\s*\(\s*['\"]memory_limit" /var/www | head -20
grep -rn --include='.user.ini' 'memory_limit' /var/www
Kako nastavite mejo cgroup za storitev FPM, opisuje Nastavitev pomnilniških mej s systemd in cgroups. Brez te zunanje meje lahko ena sama zahteva spravi celoten strežnik v pomnilniško stisko.
Po vsaki spremembi znova zaženite vse delavce PHP. Tekoči delavec obdrži svoje stare vrednosti.
Kaj velja po posodobitvi
S popravljenimi različicami se je po priročniku PHP spremenilo tudi obnašanje memory_limit. Od 8.5.12, 8.4.27, 8.3.36 in 8.2.35 je mehka meja: zahtevo za pomnilnik, ki jo preseže, je v večini primerov še dovoljeno zaključiti, preden se sproži napaka. Nova nastavitev, memory_hard_limit_percent, določa trdo mejo, ki se nikoli ne preseže.
| Nastavitev | Vrednost | Učinek po priročniku |
|---|---|---|
memory_hard_limit_percent ni nastavljen ali -1 |
privzeto | trda meja dvakrat tolikšna kot memory_limit do 1G, nad tem memory_limit plus 1G |
memory_hard_limit_percent = 150 |
primer | pri memory_limit=128M trda meja 192M |
memory_limit = -1 |
brez meje | potem ni niti trde meje |
Priročnik navaja praktično preverjalno točko: če memory_hard_limit_percent ni prepoznan, je uporabljena različica PHP prizadeta in jo je treba posodobiti. Pri backportih distribucij stanje dodatno preverite prek dnevnika sprememb paketa.
# Ali dvojiška datoteka FPM pozna novo nastavitev? (prilagodite številko različice)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'
Po posodobitvi je memory_limit=-1 opravil svoj namen. Vrnite se na končno vrednost, ki ustreza aplikaciji, in jo zaklenite s php_admin_value. Meja cgroup lahko ostane kot dodatna zaščitna plast.
Kako PHP SOS pomaga konkretno?
- Ugotovimo, kje je na vašem strežniku
memory_limitnastavljen in prepisan, vključno z aplikacijami. - Prehodne ukrepe php.net izvedemo na pravem mestu in dodamo mejo cgroup za storitev FPM.
- Prek storitve popravljanja PHP PHP pripeljemo na popravljeno stanje in znova zaženemo vse delavce.
- Nato spet nastavimo ustrezno končno vrednost in nastavitve dokumentiramo.
Pogosta vprašanja
Kakšna je privzeta vrednost memory_limit?
Po priročniku PHP 128M. Vrednost omejuje, koliko pomnilnika sme zasesti posamezen skript. Spremeniti jo je mogoče v php.ini, v konfiguraciji strežnika, v poolu FPM in med izvajanjem z ini_set(), če ni zaklenjena s php_admin_value.
Zakaj php.net pri PHP2Shell svetuje memory_limit=-1?
Ena od ranljivosti, CVE-2026-109618, je povezana s stanjem ob pomanjkanju pomnilnika. Po php.net memory_limit=-1 odstrani ciljno sprožljiv doseg pomnilniške meje PHP, ne pa vsake napake pomnilnika. Ukrep ni popolna zaščita in ga je treba združiti z mejo pomnilnika prek vsebnika ali cgroup.
Ali smem mejo namesto tega nastaviti z ulimit?
Ne. php.net izrecno odsvetuje uporabo RLIMIT_AS ali RLIMIT_DATA kot nadomestila, ker lahko ti meji sprožita prav ranljivo napako pri zahtevi za pomnilnik. Priporočena je meja prek vsebnika ali cgroup.
Kaj velja po posodobitvi na popravljeno različico PHP?
Po priročniku je memory_limit v popravljenih različicah mehka meja, dopolnjena s trdo mejo prek memory_hard_limit_percent. Prehodni ukrep z -1 je takrat opravil svoj namen in spet naj velja končna vrednost, ki ustreza aplikaciji.