Go achomair: Scaoileann PHP cuimhne den chuid is mó trí áireamh tagartha: tá a fhios ag gach luach cé mhéad athróg a dhíríonn air, agus scriostar é a luaithe a shroicheann an áireamhán sin nialas. Do thagairtí ciorclacha nach scaoilfí riamh ar an mbealach sin, tá bailitheoir truflais timthriallta ann. Ag deireadh gach iarratais glanann PHP gach rud a d'áitigh an t-iarratas freisin. Tosaíonn an dá leochaileacht PHP2Shell le staideanna cuimhne: le staid Out-of-Memory le linn próiseála iarratais agus le staid inmheánach a fhanann ró-fhada tar éis scaoilte.
Conas a bhainistíonn PHP cuimhne: forbhreathnú
I dteangacha ar nós C ní mór don chlársceidealaí cuimhne a iarraidh agus a scaoileadh é féin. Cuireann PHP an obair sin de. Áitíonn gach athróg, gach eagar agus gach oibiacht cuimhne a bhainistíonn PHP trína bhainisteoir cuimhne féin. Socraíonn memory_limit an teorainn dó sin, 128M de réir réamhshocraithe, de réir an lámhleabhair.
Do lucht cinnteoireachta tá pointe lárnach amháin ann: in oibriú clasaiceach le PHP-FPM nó mod_php ritheann próisis oibrí fadsaolacha a láimhseálann go leor iarratas ceann i ndiaidh a chéile. An méid a fhágann iarratas ina dhiaidh, ní mór é a ghlanadh go hiontaofa roimh an gcéad cheann eile. Go beacht ag an bpointe seo atá ceann de leochaileachtaí PHP2Shell.
Áireamh tagartha: cuntas ar cé a úsáideann luach
Stórálann PHP gach luach i gcoimeádán, an zval mar a thugtar air. Taobh le cineál agus ábhar, tá áireamhán tagartha (refcount) aige de réir an lámhleabhair agus marc an bhfuil an luach mar chuid de thagairt PHP le & (is_ref).
<?php
$a = str_repeat('x', 1000); // luach amháin, refcount 1
$b = $a; // gan cóipeáil, refcount 2
$b .= 'y'; // anois amháin a chóipeáiltear (Copy-on-Write)
unset($a); // titeann refcount an bhunaidh
// Nuair a shroicheann áireamhán 0, scaoileann PHP an chuimhne láithreach.
Tugtar Copy-on-Write ar an bprionsabal: ní chóipeálann PHP luach go dtí go n-athraíonn ceann de na hathróga é. Sábhálann sé sin a lán cuimhne. Is féidir áireamhán athróige a dhéanamh infheicthe leis an eisínteacht Xdebug agus an fheidhm xdebug_debug_zval(). Cuireann an lámhleabhar in iúl go bhféadfadh na huimhreacha cruinne a bheith éagsúil de réir leagan PHP.
Timthriallta: nuair nach leor áireamh tagartha
Tá laige aitheanta ag áireamh tagartha. Má dhíríonn struchtúr air féin, ní thiteann a áireamhán go nialas choíche.
<?php
$a = ['eins'];
$a[] = &$a; // tá tagairt don eagar féin san eagar
unset($a); // ní féidir le haon duine rochtain a fháil air a thuilleadh, ach fanann refcount ag 1
De réir an lámhleabhair tarlaíonn tagairtí ciorclacha den sórt sin go háirithe le hoibiachtaí, mar shampla i struchtúir tuismitheora-linbh nó i bparsálaithe. Tá sceitheadh aonair neamhdhíobhálach, toisc go nglanann PHP ag deireadh an iarratais. I bpróisis fhadsaolacha ar nós oibrithe scuaine nó rith mór tástála, áfach, is féidir le milliúin díobh fadhb chuimhne fhíor a chruthú.
An bailitheoir truflais timthriallta
Ó PHP 5.3.0 i leith úsáideann PHP algartam de réir Bacon agus Rajan chun timthriallta den sórt sin a aimsiú. An bunsmaoineamh: ní féidir timthriall a bheith ann ach má thiteann áireamhán go luach níos mó ná nialas. Ní chuimhníonn PHP ach ar na luachanna sin mar fhréamhacha féideartha.
- Téann fréamhacha féideartha i maolán. Luann an lámhleabhar 10,000 iontráil mar mhéid réamhshocraithe; taispeánann
gc_status()an tairseach atá bailí faoi láthair sa réimsethreshold. - Nuair atá an maolán lán, téann PHP trí gach luach inrochtana agus laghdaíonn sé a n-áireamháin ar thriail.
- In dara pas, is truflais iad luachanna le háireamhán nialais; do gach ceann eile cuirtear an laghdú ar ais.
- Baintear na fréamhacha as an maolán agus scaoiltear gach luach a aithníodh mar thruflais.
Rialaítear é trí zend.enable_gc (ar siúl de réir réamhshocraithe) nó ag am rite le gc_enable() agus gc_disable(). Cuireann gc_collect_cycles() rith i bhfeidhm de láimh agus tugann sé líon na dtimthriallta a bailíodh ar ais.
Cuimhne a thomhas agus a bhreathnú
| Feidhm | Cuspóir |
|---|---|
memory_get_usage() |
cuimhne atá á húsáid faoi láthair ag an script |
memory_get_usage(true) |
cuimhne a chuir an bainisteoir cuimhne in áirithe ón gcóras; seiceáiltear memory_limit i gcoinne an luacha seo |
memory_get_peak_usage() |
uastairseach na cuimhne atá á húsáid |
gc_status() |
rite, timthriallta bailithe, tairseach, fréamhacha; ó PHP 8.3.0 amanna rite freisin |
gc_collect_cycles() |
bailiú timthriallta a spreagadh láithreach |
WeakMap |
sannadh d'oibiachtaí gan a scaoileadh a chosc, ó PHP 8.0 |
De réir an lámhleabhair ní thógann memory_get_usage() san áireamh ach cuimhne a iarrann PHP trína bhainisteoir cuimhne féin. An méid a fhaigheann eisínteachtaí go díreach ón gcóras oibriúcháin, tá sé in easnamh ó na huimhreacha seo. Dá bhrí sin is é an córas oibriúcháin nó an coimeádán atá freagrach as teorainn chuimhne an phróisis iomláin.
Bainistiú cuimhne agus PHP2Shell
Treoraíonn tuairiscí an dá leochaileacht go díreach chuig an ábhar seo. Le CVE-2026-109618 is féidir le staid Out-of-Memory PHP a idirbhriseadh nuair nach bhfuil sonraí an iarratais tosaithe ach go páirteach; agus an glanadh ar siúl, d'fhéadfaí sonraí neamhbhailí a láimhseáil mar shonraí bailí ansin. Míníonn an leathanach memory_limit agus Out-of-Memory cad a tharlaíonn go hinmheánach le linn ró-ualaigh chuimhne. Le CVE-2026-109619 is féidir le staid inmheánach iarratais fanacht tar éis an chuimhne a scaoileadh agus iarratas níos déanaí san oibrí céanna í a úsáid sula gcuirtear ar ais í. Déanann an leathanach An timthriall saoil iarratais cur síos ar an sreabhadh ón tús go dtí an glanadh.
Mar bheart idirthréimhseach molann php.net memory_limit=-1 a leagan ionas nach féidir le feidhmchláir é a shárú, mar shampla le php_admin_value i linn FPM, agus an chuimhne a theorannú trí choimeádán nó cgroups ina ionad, ní trí RLIMIT_AS nó RLIMIT_DATA. Léiríonn an t-alt Teorainneacha cuimhne a shocrú le systemd agus cgroups conas é sin a dhéanamh le systemd.
; linn FPM: beart idirthréimhseach de réir php.net, ansin gach oibrí a atosú
php_admin_value[memory_limit] = -1
Gan teorainn trí choimeádán nó cgroup, is féidir le próiseas aonair an freastalaí a ghlacadh go hiomlán. Agus ní thagann aon socrú in ionad an nuashonraithe go PHP 8.5.12, 8.4.27, 8.3.36 nó 8.2.35 agus atosú gach oibrí, mar ní bhaineann ach an t-atosú seanphróisis as an gcuimhne.
Conas a chabhraíonn PHP SOS go praiticiúil?
- Seiceálaimid na socruithe cuimhne éifeachtacha do gach linn agus an bhféadfadh feidhmchláir iad a shárú.
- Cuirimid na bearta idirthréimhseacha i bhfeidhm le teorainn chuimhne ar leibhéal coimeádáin nó cgroup agus déanaimid tástáil ar an ualach.
- Suiteálaimid an nuashonrú, atosaímid gach oibrí agus cruthaímid nach bhfuil aon seanphróisis ag rith a thuilleadh, mar chuid dár seirbhís paistithe PHP.
- Measaimid earráidí cuimhne agus oibrithe a stopadh sna logaí ón 20.10.2026 i leith.
Ceisteanna coitianta
Cad é áireamh tagartha i PHP?
Áiríonn PHP do gach luach cé mhéad athróg nó eilimint a thugann tagairt dó. Nuair a thiteann an áireamhán go nialas, scaoiltear an chuimhne láithreach. Ar an gcaoi sin tugtar an chuid is mó den chuimhne ar ais gan rith glantacháin ar leith.
Cén fáth a dteastaíonn bailitheoir truflais ó PHP mar sin féin?
Do thimthriallta. Má thagraíonn eagar dó féin nó má bhíonn aithne ag dhá oibiacht ar a chéile, ní thiteann an áireamhán go nialas riamh, fiú mura bhfuil aon duine ag rochtain orthu a thuilleadh. Aimsíonn bailitheoir truflais na dtimthriallta struchtúir den sórt sin agus baineann sé amach iad.
An scaoileann PHP an chuimhne ag deireadh iarratais?
Scaoileann, glanann PHP cuimhne a áitíonn script le linn iarratais ag deireadh an iarratais. Maidir le PHP2Shell, áfach, baineann CVE-2026-109619 go beacht leis an gcás inar féidir le staid inmheánach fanacht tar éis scaoilte agus iarratas níos déanaí san oibrí céanna í a úsáid.
Cén fáth a molann php.net memory_limit=-1 mar bheart idirthréimhseach?
Tá an leochaileacht CVE-2026-109618 ceangailte le staid Out-of-Memory. Molann php.net memory_limit=-1 a leagan ionas nach féidir le feidhmchláir é a shárú, agus an chuimhne a theorannú trí choimeádán nó cgroups ina ionad sin. Ní cosaint iomlán é sin agus ní thagann sé in ionad an nuashonraithe.