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, a što se pri nedostatku memorije događa unutar PHP-a, objašnjava memory_limit i 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:
- Postaviti
memory_limit=-1, po mogućnosti tako da aplikacije vrijednost ne mogu nadjačati, primjerice pomoćuphp_admin_valueu FPM poolu ili u Apache konfiguraciji. - Provjeriti da se nigdje ponovno ne postavlja konačna granica, ni u drugom poolu, ni u konfiguraciji direktorija, ni u aplikaciji.
- 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.
- Ne koristiti
RLIMIT_ASniRLIMIT_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.
; FPM pool, npr. /etc/php/8.3/fpm/pool.d/www.conf (samo do ažuriranja)
php_admin_value[memory_limit] = -1
# 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. Bez te vanjske granice jedan jedini zahtjev može cijeli poslužitelj dovesti u nestašicu memorije.
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.
# 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 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.