An cás reatha: PHP2Shell. Ceadaíonn dhá leochaileacht chriticiúla PHP (CVSS 9.2) cód mailíseach gan logáil isteach. Paistí ar fáil ón 21 Deireadh Fómhair 2026.Cad atá le déanamh anois →

Teorainneacha cuimhne a shocrú le systemd agus cgroups

Molann php.net memory_limit=-1 agus teorainn chuimhne lasmuigh de PHP mar bheart idirthréimhseach PHP2Shell. Seo conas a shocraíonn tú an teorainn sin le systemd agus cgroups, gan go dtarraingíonn worker aonair an tseirbhís ar fad leis.

Staid Am léitheoireachta: 6 nóim.Cruatú agus cumraíocht

Go achomair: Do bheart idirthréimhseach PHP2Shell memory_limit=-1 teastaíonn teorainn chuimhne ó PHP-FPM lasmuigh de PHP. Faoi systemd socraíonn tú í le MemoryHigh= mar bhrú agus MemoryMax= mar uasteorainn chrua i gcomhad forlíontach don tseirbhís FPM. Tá ulimit, LimitAS= nó LimitDATA= míoiriúnach chuige sin de réir php.net. Seiceáil OOMPolicy= freisin, ionas nach gcuireann worker aonair deireadh leis an tseirbhís ar fad.

Moladh a chuireann ionadh ar dtús

I measc na mbeart idirthréimhseach a d'fhoilsigh php.net an 21 Deireadh Fómhair 2026 do PHP2Shell, tá ceann a chuir go leor riarthóirí ag smaoineamh: memory_limit=-1, is é sin gan teorainn chuimhne i PHP féin. Ar feadh blianta measadh gurbh é an rud contrártha dea-chleachtas.

Tá nasc le cur síos na leochaileachta intuigthe. I gcás CVE-2026-109618 is féidir le staid as-chuimhne PHP a idirbhriseadh agus sonraí iarratais á dtosú go páirteach amháin. Aistríonn an beart idirthréimhseach an teorainn chuimhne as PHP isteach sa chóras oibriúcháin. Ceanglaíonn php.net go sainráite é le dhá choinníoll: caithfidh an luach a bheith faoi ghlas i gcoinne scríobh os a chionn, agus caithfidh an teorainn teacht trí choimeádán nó cgroup, ní trí RLIMIT_AS ná RLIMIT_DATA.

An té nach gcuireann i bhfeidhm ach an chéad leath, tá freastalaí aige gan teorainn chuimhne ar bith. Léiríonn an t-alt seo an dara leath. Fiú le chéile fanann an beart ina idirthréimhse: ní dhúntar an leochaileacht go dtí PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 nó backport deimhnithe.

cgroups mínithe i dhá abairt

Is feidhm d'eithne Linux iad Control Groups, cgroups mar ghearrthéarma, a ghrúpálann próisis agus a chuireann teorainn lena n-acmhainní. Cruthaíonn systemd cgroup dá chuid féin go huathoibríoch do gach seirbhís, agus baineann gach próiseas den tseirbhís, i gcás na seirbhíse FPM an máistir agus na workers go léir, léi.

Socraíonn roghanna cuimhne systemd luachanna rialaitheora cuimhne cgroup v2. An úsáideann do chóras cgroup v2, léiríonn ordú gairid:

# "cgroup2fs" ciallaíonn: tá cgroup v2 gníomhach
stat -fc %T /sys/fs/cgroup/

Úsáideann leaganacha reatha na ndáiltí coitianta cgroup v2 de réir réamhshocraithe. Má thaispeánann an t-ordú rud éigin eile, soiléirigh sin roimh an aistriú, mar go ndéanann doiciméadacht systemd cur síos ar na seanroghanna v1 mar seanchaite.

systemd MemoryMax a shocrú do PHP-FPM

Téann an teorainn i gcomhad forlíontach, ar a dtugtar drop-in. Ar an gcaoi sin fanann comhad unit an phacáiste gan athrú, agus ní scríobhann nuashonrú os cionn do shocrú. Athraíonn ainmneacha seirbhíse de réir dáilte; úsáideann an sampla Debian agus Ubuntu le PHP 8.3.

# Osclaíonn eagarthóir don drop-in: sudo systemctl edit php8.3-fpm
# Toradh: /etc/systemd/system/php8.3-fpm.service.d/override.conf
[Service]
MemoryAccounting=yes
MemoryHigh=1536M
MemoryMax=2G
MemorySwapMax=0
OOMPolicy=continue

Na roghanna i ngearrchuntas, de réir dhoiciméadacht systemd:

Rogha Éifeacht Nóta do PHP-FPM
MemoryHigh= teorainn throttle: moillítear próisis go mór, tógtar cuimhne ar ais an príomhlasc rialaithe, beagán faoi MemoryMax
MemoryMax= teorainn absalóideach: mura féidir í a choinneáil, éiríonn an OOM-Killer gníomhach sa tseirbhís an líne chosanta dheireanach
MemorySwapMax= teorainn le haghaidh swap cuireann 0 cosc ar an tseirbhís dul sa swap ina ionad
OOMPolicy= iompar tar éis imeachta OOM: continue, stop nó kill ligeann continue don chuid eile de na workers leanúint ar aghaidh
LimitAS=, LimitDATA= rlimits in aghaidh an phróisis míoiriúnach don bheart seo de réir php.net

Is fiú aird speisialta a thabhairt ar OOMPolicy=. Le stop nó kill cuireann systemd deireadh leis an tseirbhís ar fad tar éis imeachta OOM, agus teipeann ar gach suíomh gréasáin den tseirbhís FPM sin. An luach atá i bhfeidhm gan sonrú, socraíonn réamhshocrú an chórais DefaultOOMPolicy= é. Seiceáil an luach éifeachtach dá bhrí sin, in ionad glacadh leis.

Ina dhiaidh sin atosaigh an tseirbhís agus cuir memory_limit faoi ghlas sa linn:

sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryHigh -p MemoryMax -p MemorySwapMax -p OOMPolicy -p MemoryCurrent
; Comhad linne, m.sh. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_value[memory_limit] = -1

Conas a oibríonn an glasáil, déanann php_admin_value: socruithe a chosc ar scríobh os a gcionn cur síos air.

An luach ceart a fháil

Cruthaíonn teorainn róghann briseadh sa ghnáthoibriú, ní chosnaíonn ceann ró-fhlaithiúil mórán. Is é an t-úsáid iarbhír an pointe tosaigh.

  1. Bí ag breathnú ar riachtanas cuimhne reatha gach próisis FPM thar roinnt laethanta, buaicuaireanna ualaigh san áireamh.
  2. Faigh amach gá tipiciúil worker agus iolraigh é le pm.max_children gach linne den tseirbhís.
  3. Pleanáil forlíonadh don phróiseas máistir, OPcache agus buaicphointí.
  4. Socraigh MemoryHigh= díreach os cionn na buaicluacha tomhaiste, MemoryMax= le beagán spáis os a chionn.
  5. Coigeartaigh luachanna tar éis seachtaine de réir na dtomhas agus imeachtaí OOM.
# Cuimhne gach próisis PHP-FPM i MB (Resident Set Size)
ps -C php-fpm8.3 -o rss= | awk '{s+=$1} END {printf "%.0f MB\n", s/1024}'
# Forbhreathnú reatha ar gach cgroup sórtáilte de réir cuimhne
systemd-cgtop -m

Ba cheart duit an luach do memory_limit a bhreacadh síos roimh an aistriú. Tar éis an nuashonraithe is féidir leat filleadh ar theorainn sheasta i PHP; conas í a roghnú go ciallmhar, tá sé ag memory_limit a shocrú i gceart.

Monatóireacht: cathain a chuireann an teorainn isteach

Is foinse chiúin earráide é teorainn chuimhne nach dtugann aon duine faoi deara nuair a spreagtar í. Comhaireann an eithne imeachtaí OOM in aghaidh cgroup, agus tugann systemd agus prótacal na heithne faoi deara iad.

# Comhaireamh OOM de cgroup na seirbhíse (cosán le cgroup v2)
cat /sys/fs/cgroup/system.slice/php8.3-fpm.service/memory.events
# Teachtaireachtaí an OOM-Killer i bprótacal na heithne
journalctl -k --since "-1 day" | grep -i "out of memory"

Má ardaíonn an comhaireamh oom_kill, cuireann an eithne deireadh le workers. Is féidir go léiríonn sé sin teorainn róghann, feidhmchlár lochtach nó iarratais neamhghnácha. Sa chás reatha is fiú imeachtaí den sórt sin a chur i gcomparáid le prótacail rochtana ag an am céanna.

Tábhachtach

Is beart idirthréimhseach é an teorainn chuimhne agus ní chuireann sí ionad an nuashonraithe PHP. Pleanáil an nuashonrú ag an am céanna, agus atosaigh gach próiseas PHP ina dhiaidh. Tá forbhreathnú ar na bearta idirthréimhseacha go léir ag Gníomhartha láithreacha mura féidir leat paistiú fós.

Cad a tharlaíonn taobh istigh de PHP nuair a bhíonn easpa cuimhne ann, míníonn memory_limit agus as-chuimhne. In Apache le mod_php baineann an teicníocht chéanna leis an tseirbhís Apache, ach roinneann PHP an teorainn leis an bhfreastalaí gréasáin féin ansin.

Conclúid: ná déan dearmad ar an dara leath

Ní beart idirthréimhseach inchosanta é memory_limit=-1 ach i dteannta teorainn sheachtraigh. Éascaíonn systemd an teorainn seo le cúpla líne: MemoryHigh mar bhrú, MemoryMax mar uasteorainn chrua, MemorySwapMax in aghaidh éalú isteach sa swap agus OOMPolicy roghnaithe d'aon turas. Tomhais roimh ré, bí ag faire ina dhiaidh, agus coinnigh i gcuimhne go roinneann gach linn de chuid seirbhíse an teorainn.

Thar aon rud eile: pleanáil deireadh an bhirt. Tar éis an nuashonraithe go leagan ceartaithe PHP filleann tú ar memory_limit seasta. Is féidir leat an teorainn cgroup a choinneáil mar chosaint bhreise in aghaidh próiseas atá ag dul as smacht.

Conas a chabhraíonn PHP SOS go nithiúil?

  • Tomhas: Taifeadaimid riachtanas cuimhne do sheirbhísí PHP agus díorthaímid teorainneacha oiriúnacha as.
  • Cur i bhfeidhm: Socraímid drop-ins le MemoryHigh, MemoryMax agus OOMPolicy oiriúnach, cuirimid memory_limit faoi ghlas sa linn agus atosaímid na seirbhísí ar bhealach rialaithe.
  • Monatóireacht: Ionchorpraímid imeachtaí OOM sa mhonatóireacht agus coigeartaímid na luachanna.
  • Chuig an bpaiste: Tríd an tseirbhís paistí PHP suiteálaimid an nuashonrú agus aisghabhaimid na luachanna idirthréimhseacha ar bhealach eagraithe ina dhiaidh.

Ceisteanna coitianta

Cén fáth ar cheart memory_limit a bheith ar -1? Nach bhfuil sin contúirteach?

Ina aonar bheadh. Molann php.net memory_limit=-1 go sainráite mar bheart idirthréimhseach i dteannta teorainn chuimhne trí choimeádán nó cgroup. Bogann an teorannú as PHP isteach sa chóras oibriúcháin mar sin. Gan an teorainn sheachtrach seo níor cheart duit an luach a shocrú.

An féidir liom ulimit nó LimitAS= a úsáid ina n-ionad?

Ní féidir. Molann php.net go sainráite in aghaidh RLIMIT_AS agus RLIMIT_DATA, agus socraíonn ulimit -v, LimitAS= agus LimitDATA= na teorainneacha sin go beacht. Tugann doiciméadacht systemd le fios freisin go gcuireann LimitAS= teorainn leis an spás seoltaí, ní leis an úsáid cuimhne.

Cad a tharlaíonn nuair a shroicheann PHP-FPM an teorainn?

Le MemoryHigh moillíonn an eithne na próisis agus tógann sí cuimhne ar ais. Le MemoryMax éiríonn an OOM-Killer gníomhach laistigh den tseirbhís agus cuireann sé deireadh le próiseas, worker mór den chuid is mó. An stopann an tseirbhís iomlán ina dhiaidh sin, rialaíonn OOMPolicy= é.

An bhfuil an teorainn i bhfeidhm do gach linn ar leith?

Níl. Roinneann gach linn de chuid seirbhíse FPM cgroup amháin agus mar sin teorainn chomhroinnte. Teastaíonn seirbhísí FPM nó coimeádáin ar leith le haghaidh teorainneacha scartha do gach suíomh gréasáin.

Conas a shocraím an teorainn i Docker nó i Kubernetes?

Tríd an teorainn cuimhne den choimeádán, mar shampla an rogha --memory le docker run nó resources.limits.memory i Kubernetes. Úsáideann an bheirt acu cgroups freisin. Fanann an prionsabal mar an gcéanna: teorainn lasmuigh de PHP, memory_limit faoi ghlas i PHP.

Foinsí

Teagmháil láithreach

Cuireann gach uair an chloig leis. Scríobh chugainn anois.

Déan cur síos gearr ar an gcóras, leagan PHP agus an rud a thug tú faoi deara. Cuirfimid scéala chugat, soiléireoimid an cás agus oibreoimid go cianda go dtí go mbeidh an teagmhas dúnta agus doiciméadaithe.

Cabhair láithreach