# Pravilno postaviti memory_limit

> Pravilno postavite PHP memory_limit: što vrijednost čini, gdje vrijedi, što php.net privremeno savjetuje za PHP2Shell i što vrijedi nakon ažuriranja.

Izvor: https://phpsos.de/hr/blog/memory-limit-richtig-setzen/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** `memory_limit` određuje koliko memorije smije zauzeti pojedini PHP zahtjev; zadano je 128M. U redovitom radu postavite konačnu vrijednost prilagođenu aplikaciji i zaključajte je pomoću `php_admin_value`. Dok PHP2Shell nije zakrpan, php.net privremeno savjetuje `memory_limit=-1`, bez mogućnosti nadjačavanja i u kombinaciji s granicom putem kontejnera ili cgroupa, a ne putem `RLIMIT_AS` ili `RLIMIT_DATA`. Nakon ažuriranja ponovno vrijedi konačna vrijednost.

## Rutinska postavka koja je odjednom sigurnosna tema

Godinama je `memory_limit` bio vijak za podešavanje programera. Kad web-stranica javi „Allowed memory size exhausted“, vrijednost se poveća i problem je riješen. S PHP2Shellom to je postalo sigurnosno pitanje, a preporuka php.net-a na prvi pogled djeluje paradoksalno: za prijelazno razdoblje PHP-ova vlastita granica memorije treba potpuno otpasti.

Pozadina je CVE-2026-109618. Prema PHP projektu stanje nedostatka memorije (out of memory) može prekinuti PHP dok su podaci zahtjeva tek djelomično inicijalizirani. Čišćenje zahtjeva tada može neispravne podatke tretirati kao ispravne. Tehničke pojedinosti nalaze se na stranici [CVE-2026-109618](https://phpsos.de/hr/php2shell/cve-2026-109618/), a što se pri nedostatku memorije događa unutar PHP-a, objašnjava [memory_limit i Out-of-Memory](https://phpsos.de/hr/php/out-of-memory/). Za operatere je važno pitanje: koja vrijednost vrijedi kada i gdje mora stajati?

## Što memory_limit čini u redovitom radu

Prema PHP priručniku `memory_limit` ograničava memoriju koju smije zauzeti skripta i tako štiti poslužitelj od loše napisanog koda. Zadano je `128M`, a `-1` znači bez granice. Dopuštene su skraćene oznake poput `256M` ili `1G`.

Dva su svojstva važna za sigurnost. Prvo, vrijednost se može promijeniti posvuda, i tijekom rada putem `ini_set()`. Mnogi CMS-ovi i shopovi sami je povećavaju, primjerice za uvoze ili obradu slika. Tko želi nametnuti vrijednost, mora je postaviti pomoću `php_admin_value`; prema priručniku tako postavljene vrijednosti ne mogu se nadjačati putem `ini_set()`. Drugo, priručnik preporučuje da `memory_limit` bude veći od `post_max_size`.

Koja vrijednost odgovara, ovisi o aplikaciji. Pogled u zapisnik pogrešaka pokazuje javljaju li se poruke o iscrpljenoj memoriji i kod kojih poziva. Pokazalo se dobrim vrijednost odrediti po web-stranici u vlastitom FPM poolu: velikodušnije za shop s uvozima, štedljivije za jednostavnu tvrtkinu stranicu. Paušalno vrlo visoka vrijednost za sve web-stranice troši zaštitni učinak jer tada jedan pogrešan ili zloupotrijebljen zahtjev može zauzeti mnogo memorije.

Od PHP-a 8.5 postoji i `max_memory_limit`. Ta se postavka može zadati samo pri pokretanju i ograničava koliko visoko uopće smije biti postavljen `memory_limit`. Više vrijednosti obrezuju se uz upozorenje. Zadano `-1` znači bez gornje granice.

## memory_limit nakon PHP2Shella: prijelazna mjera php.net-a

Za poslužitelje koji još nisu ažurirani na 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 odnosno potvrđeni backport, php.net u sigurnosnoj obavijesti od 21. 10. 2026. navodi sljedeće korake. Oni smanjuju rizik pojedinih putova napada, ali prema php.net-u instalaciju ne čine sigurnom:

1. **Postaviti `memory_limit=-1`,** po mogućnosti tako da aplikacije vrijednost ne mogu nadjačati, primjerice pomoću `php_admin_value` u FPM poolu ili u Apache konfiguraciji.
2. **Provjeriti da se nigdje ponovno ne postavlja konačna granica,** ni u drugom poolu, ni u konfiguraciji direktorija, ni u aplikaciji.
3. **Postaviti ograničenje memorije putem kontejnera ili cgroupa,** kao zaštitu dostupnosti, po mogućnosti tako da se pri prekoračenju prekida samo pogođeni worker.
4. **Ne koristiti `RLIMIT_AS` ni `RLIMIT_DATA`.** Prema php.net-u te granice mogu izazvati upravo ranjivu pogrešku pri zahtjevu za memorijom.

php.net uz to objašnjava da `-1` uklanja ciljano izazivo dosezanje PHP-ove granice memorije, ali da memorijska pogreška na nižoj razini i dalje može dosegnuti ranjivi put. Pregled svih prijelaznih mjera nalazi se na stranici [Hitne mjere ako još ne možete zakrpati](https://phpsos.de/hr/php2shell/sofortmassnahmen-ohne-patch/).

```ini
; FPM pool, npr. /etc/php/8.3/fpm/pool.d/www.conf (samo do ažuriranja)
php_admin_value[memory_limit] = -1
```

```bash
# Gdje se sve postavlja memory_limit (samo čitanje)
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 postaviti cgroup granicu za FPM uslugu, opisuje članak [Postaviti granice memorije pomoću systemd-a i cgroupa](https://phpsos.de/hr/blog/speichergrenzen-systemd-cgroups/). Bez te vanjske granice jedan jedini zahtjev može cijeli poslužitelj dovesti u nestašicu memorije.

> **Važno:**
> Nakon svake izmjene ponovno pokrenite sve PHP workere. Pokrenuti worker zadržava svoje stare vrijednosti.

## Što vrijedi nakon ažuriranja

Prema PHP priručniku s ispravljenim verzijama promijenilo se i ponašanje `memory_limit`. Od 8.5.12, 8.4.27, 8.3.36 i 8.2.35 to je meka granica: zahtjev za memorijom koji je premašuje u većini slučajeva smije se još dovršiti prije nego se izazove pogreška. Nova postavka, `memory_hard_limit_percent`, određuje tvrdu granicu koja se nikad ne premašuje.

| Postavka | Vrijednost | Učinak prema priručniku |
|---|---|---|
| `memory_hard_limit_percent` nije postavljen ili `-1` | zadano | tvrda granica dvostruko viša od `memory_limit` do 1G, iznad toga `memory_limit` plus 1G |
| `memory_hard_limit_percent = 150` | primjer | uz `memory_limit=128M` tvrda granica 192M |
| `memory_limit = -1` | bez granice | tada nema ni tvrde granice |

Priručnik navodi praktičnu točku provjere: ako se `memory_hard_limit_percent` ne prepoznaje, korištena je verzija PHP-a pogođena i mora se ažurirati. Kod backportova distribucija stanje dodatno provjerite putem changeloga paketa.

```bash
# Poznaje li FPM binarna datoteka novu postavku? (prilagoditi broj verzije)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'
```

Nakon ažuriranja `memory_limit=-1` ispunio je svoju svrhu. Vratite se na konačnu vrijednost prilagođenu aplikaciji i zaključajte je pomoću `php_admin_value`. cgroup granica može ostati kao dodatni zaštitni sloj.

## Kako PHP SOS konkretno pomaže?

- Utvrđujemo gdje se na Vašem poslužitelju postavlja i nadjačava `memory_limit`, uključujući aplikacije.
- Prijelazne mjere php.net-a provodimo na pravom mjestu i dopunjujemo ih cgroup granicom za FPM uslugu.
- Putem [PHP Patch usluge](https://phpsos.de/hr/leistungen/php-patch-service/) PHP dovodimo na ispravljeno stanje i ponovno pokrećemo sve workere.
- Zatim ponovno postavljamo prikladnu konačnu vrijednost i dokumentiramo postavke.


## Česta pitanja

**Koja je zadana vrijednost memory_limit?**  
Prema PHP priručniku 128M. Vrijednost ograničava koliko memorije smije zauzeti pojedina skripta. Može se mijenjati u php.ini, u konfiguraciji poslužitelja, u FPM poolu i tijekom rada putem ini_set(), osim ako je zaključana pomoću php_admin_value.

**Zašto php.net kod PHP2Shella savjetuje memory_limit=-1?**  
Jedna od ranjivosti, CVE-2026-109618, povezana je sa stanjem pri nedostatku memorije. Prema php.net-u memory_limit=-1 uklanja ciljano izazivo dosezanje PHP-ove granice memorije, ali ne svaku memorijsku pogrešku. Mjera nije potpuna zaštita i mora se kombinirati s ograničenjem memorije putem kontejnera ili cgroupa.

**Smijem li umjesto toga postaviti granicu pomoću ulimit?**  
Ne. php.net izričito odgovara od korištenja RLIMIT_AS ili RLIMIT_DATA kao zamjene jer te granice mogu izazvati upravo ranjivu pogrešku pri zahtjevu za memorijom. Preporučuje se granica putem kontejnera ili cgroupa.

**Što vrijedi nakon ažuriranja na ispravljenu verziju PHP-a?**  
Prema priručniku memory_limit je u ispravljenim verzijama meka granica, dopunjena tvrdom granicom putem memory_hard_limit_percent. Prijelazna mjera s -1 tada je ispunila svrhu i opet bi trebala vrijediti konačna vrijednost prilagođena aplikaciji.

## Izvori

- [php.net: sigurnosna obavijest od 21. 10. 2026.](https://www.php.net/)
- [PHP priručnik: osnovne postavke (memory_limit)](https://www.php.net/manual/en/ini.core.php)
- [PHP priručnik: FPM konfiguracija](https://www.php.net/manual/en/install.fpm.configuration.php)
