Fil-qosor: Għall-miżura tranżitorja ta' PHP2Shell memory_limit=-1, PHP-FPM għandu bżonn limitu tal-memorja barra minn PHP. Taħt systemd tissettjah b'MemoryHigh= bħala brejk u MemoryMax= bħala limitu massimu iebes f'fajl supplimentari għas-servizz FPM. ulimit, LimitAS= jew LimitDATA= huma għal dan, skont php.net, mhux adattati. Ivverifika wkoll OOMPolicy=, biex worker wieħed ma jtemmx is-servizz kollu.
Rakkomandazzjoni li l-ewwel tqajjem mistoqsijiet
Fost il-miżuri tranżitorji li php.net ippubblika fil-21 ta' Ottubru 2026 dwar PHP2Shell hemm waħda li ħalliet ħafna amministraturi jistagħġbu: memory_limit=-1, jiġifieri l-ebda limitu tal-memorja f'PHP innifsu. Għal snin sħaħ l-oppost kien jitqies prattika tajba.
Konnessjoni mad-deskrizzjoni tal-vulnerabbiltà hija ovvja. F'CVE-2026-109618 stat ta' out-of-memory jista' jinterrompi PHP waqt li d-data tat-talba tkun inizjalizzata biss parzjalment. Il-miżura tranżitorja ċċaqlaq il-limitu tal-memorja minn PHP lejn is-sistema operattiva. php.net jorbotha espliċitament ma' żewġ kundizzjonijiet: il-valur irid ikun imblukkat kontra sostituzzjoni, u l-limitu jrid jiġi minn container jew cgroup, mhux minn RLIMIT_AS jew RLIMIT_DATA.
Min jimplimenta biss l-ewwel nofs ikollu server mingħajr l-ebda limitu tal-memorja. Dan l-artikolu juri t-tieni nofs. Anke flimkien il-miżura tibqa' tranżizzjoni: il-vulnerabbiltà hija rranġata biss b'PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 jew backport ikkonfermat.
cgroups spjegati f'żewġ sentenzi
Control Groups, fil-qosor cgroups, huma funzjoni tal-kernel ta' Linux li tiġbor il-proċessi f'gruppi u tillimita r-riżorsi tagħhom. systemd joħloq awtomatikament cgroup proprja għal kull servizz, u l-proċessi kollha tas-servizz, ma' servizz FPM għalhekk il-master u l-workers kollha, jappartjenu lilha.
L-għażliet tal-memorja ta' systemd jissettjaw valuri tal-memory controller ta' cgroup v2. Jekk is-sistema tiegħek tużax cgroup v2 turi kmand qasir:
# "cgroup2fs" ifisser: cgroup v2 hija attiva
stat -fc %T /sys/fs/cgroup/
Verżjonijiet attwali tad-distribuzzjonijiet komuni jużaw cgroup v2 b'mod standard. Jekk il-kmand juri xi ħaġa oħra, iċċara dan qabel il-bidla, għax id-dokumentazzjoni ta' systemd tiddeskrivi l-għażliet qodma v1 bħala skaduti.
Issettja systemd MemoryMax għal PHP-FPM
Il-limitu jmur f'fajl supplimentari, l-hekk imsejjaħ drop-in. Hekk il-fajl tal-unit tal-pakkett jibqa' mhux mibdul, u aġġornament ma jikteb fuq l-issettjar tiegħek. L-ismijiet tas-servizzi jvarjaw skont id-distribuzzjoni; l-eżempju juża Debian u Ubuntu b'PHP 8.3.
# Tiftaħ editur għad-drop-in: sudo systemctl edit php8.3-fpm
# Riżultat: /etc/systemd/system/php8.3-fpm.service.d/override.conf
[Service]
MemoryAccounting=yes
MemoryHigh=1536M
MemoryMax=2G
MemorySwapMax=0
OOMPolicy=continue
L-għażliet f'ħarsa ġenerali, skont id-dokumentazzjoni ta' systemd:
| Għażla | Effett | Nota għal PHP-FPM |
|---|---|---|
MemoryHigh= |
limitu ta' throttling: il-proċessi jitbaxxew ħafna, il-memorja tittieħed lura | il-valur ta' kontroll veru, ftit taħt MemoryMax |
MemoryMax= |
limitu assolut: jekk ma jistax jinżamm, l-OOM-killer jidħol fis-seħħ fis-servizz | l-aħħar linja ta' difiża |
MemorySwapMax= |
limitu għall-iswapping | 0 jipprevjeni li s-servizz jaħrab fl-swap minflok |
OOMPolicy= |
imġiba wara avveniment OOM: continue, stop jew kill |
continue iħalli l-workers l-oħra jkomplu jaħdmu |
LimitAS=, LimitDATA= |
rlimits għal kull proċess | skont php.net mhux adattati għal din il-miżura |
OOMPolicy= jixraq attenzjoni partikolari. Ma' stop jew kill, systemd wara avveniment OOM itemm is-servizz kollu, u l-websajts kollha ta' dan is-servizz FPM jaqgħu. Liema valur japplika mingħajr indikazzjoni proprja jiddeċiedi l-istandard tas-sistema DefaultOOMPolicy=. Ivverifika l-valur effettiv għalhekk, minflok ma tassumih.
Wara erġa' ibda s-servizz u ibblokka memory_limit fil-pool:
sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryHigh -p MemoryMax -p MemorySwapMax -p OOMPolicy -p MemoryCurrent
; Fajl tal-pool, pereżempju /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_value[memory_limit] = -1
Kif jaħdem il-blokk jiddeskrivih php_admin_value: ibblokka l-issettjar kontra sostituzzjoni.
Sib il-valur it-tajjeb
Limitu skars żżejjed joħloq twaqqif fl-operat normali, wieħed ġeneruż żżejjed jipproteġi ftit. Il-punt tat-tluq huwa l-konsum reali.
- Osserva l-ħtieġa attwali tal-memorja tal-proċessi FPM kollha fuq ftit jiem, anke fil-quċċati tat-tagħbija.
- Iddetermina l-ħtieġa tipika ta' worker wieħed u immultiplika b'
pm.max_childrental-pools kollha tas-servizz. - Ippjana żieda għall-proċess master, OPcache u l-quċċati.
- Issettja
MemoryHigh=ftit 'il fuq mill-quċċata mkejla,MemoryMax=b'ftit distanza 'il fuq minnha. - Irranġa l-valuri wara ġimgħa skont il-kejl u l-avvenimenti OOM.
# Memorja tal-proċessi PHP-FPM kollha f'MB (Resident Set Size)
ps -C php-fpm8.3 -o rss= | awk '{s+=$1} END {printf "%.0f MB\n", s/1024}'
# Ħarsa ġenerali kontinwa tal-cgroups kollha ordnati skont il-memorja
systemd-cgtop -m
Il-valur ta' memory_limit qabel il-bidla għandek tinnotah. Wara l-aġġornament tista' terġa' lura għal limitu fiss f'PHP; kif tagħżlu sew jinsab taħt Issettja memory_limit sew.
Issorvelja: meta jaħdem il-limitu
Limitu tal-memorja li ħadd ma jinduna meta jaħdem huwa sors siekta ta' żbalji. Il-kernel jgħodd avvenimenti OOM għal kull cgroup, u systemd kif ukoll il-protokoll tal-kernel jirreġistrawhom.
# Il-counter OOM tas-cgroup tas-servizz (mogħdija ma' cgroup v2)
cat /sys/fs/cgroup/system.slice/php8.3-fpm.service/memory.events
# Messaġġi tal-OOM-killer fil-protokoll tal-kernel
journalctl -k --since "-1 day" | grep -i "out of memory"
Jekk il-counter oom_kill jogħla, il-kernel jtemm workers. Dan jista' jindika limitu skars żżejjed, applikazzjoni difettuża jew talbiet mhux tas-soltu. Fis-sitwazzjoni attwali jixraq li avvenimenti bħal dawn jitqabblu mal-protokolli tal-aċċess fl-istess ħin.
Il-limitu tal-memorja huwa miżura tranżitorja u ma jissostitwixxix l-aġġornament ta' PHP. Ippjana l-aġġornament parallelament, u wara erġa' ibda l-proċessi kollha ta' PHP. Il-miżuri tranżitorji kollha f'ħarsa ġenerali jinsabu taħt Miżuri immedjati meta ma tistax tippatchja għadek.
X'jiġri ġewwa PHP meta tonqos il-memorja jispjegah memory_limit u Out-of-Memory. Ma' Apache b'mod_php l-istess teknika tapplika għas-servizz Apache, imma PHP imbagħad jaqsam il-limitu mas-server tal-web innifsu.
Konklużjoni: tinsiex it-tieni nofs
memory_limit=-1 huwa miżura tranżitorja ammissibbli biss flimkien ma' limitu estern. systemd jagħmel dan il-limitu possibbli b'ftit linji: MemoryHigh bħala brejk, MemoryMax bħala limitu massimu iebes, MemorySwapMax kontra l-ħarba fl-swap u OOMPolicy magħżula konxjament. Ikkejjel minn qabel, osserva wara, u żomm f'moħħok li l-pools kollha ta' servizz jaqsmu l-limitu.
Aktar minn kollox: ippjana t-tmiem tal-miżura. Wara l-aġġornament għal verżjoni rranġata ta' PHP terġa' lura għal memory_limit fiss. Il-limitu tas-cgroup tista' żżommu bħala protezzjoni addizzjonali kontra proċessi li joħorġu mill-limiti.
Kif tgħin PHP SOS b'mod konkret?
- Inkejlu: niġbru l-ħtieġa tal-memorja tas-servizzi PHP tiegħek u nikkalkulaw minn hemm limiti adattati.
- Nimplimentaw: nissettjaw drop-ins b'
MemoryHigh,MemoryMaxuOOMPolicyxierqa, nibblokkawmemory_limitfil-pool u nerġgħu nibdew is-servizzi b'mod ikkontrollat. - Nosservaw: nintegraw l-avvenimenti OOM fil-monitoraġġ u nirranġaw il-valuri.
- Nwasslu għall-patch: permezz tas-Servizz ta' patch ta' PHP ninstallaw l-aġġornament u nneħħu l-valuri tranżitorji wara b'mod ordnat.
Mistoqsijiet frekwenti
Għaliex memory_limit għandu jkun -1? Mhuwiex perikoluż?
Waħdu kien ikun. php.net jirrakkomanda memory_limit=-1 bħala miżura tranżitorja espliċitament flimkien ma' limitu tal-memorja permezz ta' container jew cgroup. Il-limitazzjoni tmur b'hekk minn PHP għas-sistema operattiva. Mingħajr dan il-limitu estern m'għandekx tissettja l-valur.
Nista' nuża minflok ulimit jew LimitAS=?
Le. php.net jiskoraġġixxi espliċitament RLIMIT_AS u RLIMIT_DATA, u eżattament dawn il-limiti jissettjaw ulimit -v, LimitAS= u LimitDATA=. Id-dokumentazzjoni ta' systemd tindika wkoll li LimitAS= jillimita l-ispazju tal-indirizzi, mhux il-konsum tal-memorja.
X'jiġri meta PHP-FPM jilħaq il-limitu?
Ma' MemoryHigh il-kernel inaqqas il-veloċità tal-proċessi u jieħu lura l-memorja. Ma' MemoryMax jidħol fis-seħħ l-OOM-killer fis-servizz u jtemm proċess, ġeneralment worker kbir. Jekk wara jieqaf is-servizz kollu jiddeċiedi OOMPolicy=.
Il-limitu japplika għal kull pool waħdu?
Le. Il-pools kollha ta' servizz FPM jaqsmu cgroup waħda u għalhekk limitu komuni. Limiti separati għal kull websajt jeħtieġu servizzi FPM jew containers separati.
Kif nissettja l-limitu f'Docker jew Kubernetes?
Permezz tal-limitu tal-memorja tal-container, pereżempju l-għażla --memory ma' docker run jew resources.limits.memory f'Kubernetes. It-tnejn jużaw ukoll cgroups. Il-prinċipju jibqa' l-istess: limitu barra minn PHP, memory_limit f'PHP imblukkat.