# Pravilna nastavitev memory_limit

> PHP memory_limit pravilno nastavite: kaj vrednost povzroči, kje velja, kaj php.net svetuje začasno za PHP2Shell in kaj naj velja po posodobitvi.

Vir: https://phpsos.de/sl/blog/memory-limit-richtig-setzen/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**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](https://phpsos.de/sl/php2shell/cve-2026-109618/), kaj se ob pomanjkanju pomnilnika dogaja v notranjosti PHP, pojasnjuje [memory_limit in out-of-memory](https://phpsos.de/sl/php/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:

1. **Nastavite `memory_limit=-1`,** po možnosti tako, da aplikacije vrednosti ne morejo prepisati, na primer s `php_admin_value` v poolu FPM ali v konfiguraciji Apache.
2. **Preverite, da se nikjer znova ne nastavi končna meja,** ne v drugem poolu, ne v konfiguraciji imenika in ne v aplikaciji.
3. **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.
4. **Ne uporabljajte `RLIMIT_AS` ali `RLIMIT_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](https://phpsos.de/sl/php2shell/sofortmassnahmen-ohne-patch/).

```ini
; Pool FPM, npr. /etc/php/8.3/fpm/pool.d/www.conf (samo do posodobitve)
php_admin_value[memory_limit] = -1
```

```bash
# 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](https://phpsos.de/sl/blog/speichergrenzen-systemd-cgroups/). Brez te zunanje meje lahko ena sama zahteva spravi celoten strežnik v pomnilniško stisko.

> **Pomembno:**
> 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.

```bash
# 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_limit` nastavljen 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](https://phpsos.de/sl/leistungen/php-patch-service/) 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.

## Viri

- [php.net: varnostno obvestilo z dne 21. 10. 2026](https://www.php.net/)
- [Priročnik PHP: jedrne nastavitve (memory_limit)](https://www.php.net/manual/en/ini.core.php)
- [Priročnik PHP: konfiguracija FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
