# memory_limit pareizi iestatīt

> PHP memory_limit pareizi iestatīt: ko vērtība dara, kur tā darbojas, ko php.net PHP2Shell gadījumā pagaidām iesaka un kas jāatjauno pēc atjauninājuma.

Avots: https://phpsos.de/lv/blog/memory-limit-richtig-setzen/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi sakot:** `memory_limit` nosaka, cik daudz atmiņas drīkst aizņemt viens PHP pieprasījums; noklusējums ir 128M. Ikdienas darbībā iestatiet galīgu vērtību, kas atbilst lietojumprogrammai, un bloķējiet to ar `php_admin_value`. Kamēr PHP2Shell nav ielāpots, php.net pagaidām iesaka `memory_limit=-1`, nepārrakstāmu un kombinētu ar robežu caur konteineru vai cgroup, nevis caur `RLIMIT_AS` vai `RLIMIT_DATA`. Pēc atjauninājuma atkal spēkā ir galīga vērtība.

## Ikdienas iestatījums, kas pēkšņi kļūst par drošības jautājumu

Gadiem `memory_limit` bija regulēšanas skrūve izstrādātājiem. Ja vietne ziņo „Allowed memory size exhausted”, vērtību palielina, un problēma ir atrisināta. Ar PHP2Shell tas ir kļuvis par drošības jautājumu, un php.net ieteikums no pirmā acu uzmetiena šķiet paradoksāls: pārejas laikam PHP paša atmiņas robežai pilnībā jāatkrīt.

Fons ir CVE-2026-109618. Saskaņā ar PHP projektu Out-of-Memory stāvoklis var pārtraukt PHP brīdī, kad pieprasījuma dati ir tikai daļēji inicializēti. Pieprasījuma sakopšana tad nederīgus datus var uzskatīt par derīgiem. Tehniskās detaļas atrodamas sadaļā [CVE-2026-109618](https://phpsos.de/lv/php2shell/cve-2026-109618/), kas atmiņas trūkuma gadījumā notiek PHP iekšienē, izskaidro [memory_limit un Out-of-Memory](https://phpsos.de/lv/php/out-of-memory/). Uzturētājiem svarīgs ir jautājums: kura vērtība kad ir spēkā un kur tai jābūt?

## Ko memory_limit dara ikdienas darbībā

Saskaņā ar PHP rokasgrāmatu `memory_limit` ierobežo atmiņu, ko drīkst aizņemt skripts, un tā pasargā serveri no slikti rakstīta koda. Noklusējums ir `128M`, `-1` nozīmē bez robežas. Saīsinātie pieraksti, piemēram, `256M` vai `1G`, ir atļauti.

Drošībai svarīgas divas īpašības. Pirmkārt, vērtību var mainīt jebkur, arī izpildes laikā ar `ini_set()`. Daudzi CMS un veikali to paši palielina, piemēram, importiem vai attēlu apstrādei. Kas grib vērtību uzspiest, tam tā jāiestata ar `php_admin_value`; saskaņā ar rokasgrāmatu šādi iestatītās vērtības nevar pārrakstīt ar `ini_set()`. Otrkārt, rokasgrāmata iesaka, lai `memory_limit` būtu lielāks par `post_max_size`.

Kāda vērtība der, atkarīgs no lietojumprogrammas. Skatiens kļūdu žurnālā parāda, vai parādās ziņojumi par izsmeltu atmiņu un kuros izsaukumos. Sevi ir apliecinājusi vērtības noteikšana katrai vietnei savā FPM pūlā: devīgāka veikalam ar importiem, šaurāka vienkāršai uzņēmuma vietnei. Vispārīgi ļoti augsta vērtība visām vietnēm izšķiež aizsargājošo efektu, jo tad viens kļūdains vai ļaunprātīgi izmantots pieprasījums var piesaistīt daudz atmiņas.

Kopš PHP 8.5 ir arī `max_memory_limit`. Šo iestatījumu var iestatīt tikai startējot, un tas ierobežo, cik augstu `memory_limit` vispār drīkst iestatīt. Augstākas vērtības tiek nogrieztas ar brīdinājumu. Noklusējums `-1` nozīmē bez augšējās robežas.

## memory_limit pēc PHP2Shell: php.net pārejas pasākums

Serveriem, kas vēl nav atjaunināti uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprinātu backport, php.net 2026. gada 21. oktobra drošības paziņojumā min šādus soļus. Tie samazina atsevišķu uzbrukuma ceļu risku, bet saskaņā ar php.net instalāciju nepadara drošu:

1. **Iestatīt `memory_limit=-1`,** pēc iespējas tā, lai lietojumprogrammas vērtību nevarētu pārrakstīt, piemēram, ar `php_admin_value` FPM pūlā vai Apache konfigurācijā.
2. **Pārbaudīt, ka nekur atkal netiek iestatīta galīga robeža,** ne citā pūlā, ne direktorijas konfigurācijā, ne lietojumprogrammā.
3. **Iestatīt atmiņas robežu caur konteineru vai cgroup,** kā pieejamības aizsardzību, pēc iespējas tā, lai pārsniegšanas gadījumā tiktu pārtraukts tikai skartais worker.
4. **Neizmantot `RLIMIT_AS` vai `RLIMIT_DATA`.** Šīs robežas saskaņā ar php.net var izraisīt tieši ievainojamo kļūdu atmiņas pieprasīšanā.

php.net par to skaidro, ka `-1` novērš mērķtiecīgi izraisāmu PHP atmiņas robežas sasniegšanu, bet atmiņas kļūda dziļākā līmenī ievainojamo ceļu joprojām var sasniegt. Visu pārejas pasākumu pārskats atrodams sadaļā [Tūlītēji pasākumi, ja vēl nevarat ielāpot](https://phpsos.de/lv/php2shell/sofortmassnahmen-ohne-patch/).

```ini
; FPM pūls, piem., /etc/php/8.3/fpm/pool.d/www.conf (tikai līdz atjauninājumam)
php_admin_value[memory_limit] = -1
```

```bash
# Kur visur tiek iestatīts memory_limit (tikai lasīšana)
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
```

Kā iestatīt cgroup robežu FPM pakalpojumam, apraksta [Atmiņas robežu iestatīšana ar systemd un cgroups](https://phpsos.de/lv/blog/speichergrenzen-systemd-cgroups/). Bez šīs ārējās robežas viens pieprasījums var visu serveri novest atmiņas trūkumā.

> **Svarīgi:**
> Pēc katras izmaiņas pārstartējiet visus PHP worker procesus. Darbojošs worker saglabā savas vecās vērtības.

## Kas spēkā pēc atjauninājuma

Ar labotajām versijām saskaņā ar PHP rokasgrāmatu ir mainījusies arī `memory_limit` uzvedība. Sākot ar 8.5.12, 8.4.27, 8.3.36 un 8.2.35 tā ir mīksta robeža: atmiņas pieprasījumam, kas to pārsniedz, vairumā gadījumu vēl drīkst tikt pabeigts, pirms tiek izraisīta kļūda. Jauns iestatījums `memory_hard_limit_percent` nosaka stingru robežu, kas nekad netiek pārsniegta.

| Iestatījums | Vērtība | Ietekme saskaņā ar rokasgrāmatu |
|---|---|---|
| `memory_hard_limit_percent` nav iestatīts vai `-1` | noklusējums | stingrā robeža divreiz augstāka par `memory_limit` līdz 1G, virs tā `memory_limit` plus 1G |
| `memory_hard_limit_percent = 150` | piemērs | ja `memory_limit=128M`, stingrā robeža 192M |
| `memory_limit = -1` | bez robežas | tad nav arī stingras robežas |

Rokasgrāmata min praktisku pārbaudes punktu: ja `memory_hard_limit_percent` netiek atpazīts, izmantotā PHP versija ir skarta un jāatjaunina. Distributīvu backport gadījumā stāvokli papildus pārbaudiet pēc pakotnes changelog.

```bash
# Vai FPM binārfails pazīst jauno iestatījumu? (pielāgot versijas numuru)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'
```

Pēc atjauninājuma `memory_limit=-1` ir izpildījis savu mērķi. Atgriezieties pie galīgas vērtības, kas atbilst lietojumprogrammai, un bloķējiet to ar `php_admin_value`. Cgroup robeža var saglabāties kā papildu aizsardzības slānis.

## Kā PHP SOS palīdz konkrēti?

- Mēs noskaidrojam, kur jūsu serverī `memory_limit` tiek iestatīts un pārrakstīts, ieskaitot lietojumprogrammas.
- Mēs ieviešam php.net pārejas pasākumus pareizajā vietā un papildinām ar cgroup robežu FPM pakalpojumam.
- Ar [PHP ielāpu pakalpojumu](https://phpsos.de/lv/leistungen/php-patch-service/) mēs PHP novedam līdz labotam stāvoklim un pārstartējam visus worker procesus.
- Pēc tam mēs atkal iestatām piemērotu galīgu vērtību un dokumentējam iestatījumus.


## Biežāk uzdotie jautājumi

**Kāda ir memory_limit noklusējuma vērtība?**  
Saskaņā ar PHP rokasgrāmatu 128M. Vērtība ierobežo, cik daudz atmiņas drīkst aizņemt viens skripts. To var mainīt php.ini, servera konfigurācijā, FPM pūlā un izpildes laikā ar ini_set(), ja vien tā nav bloķēta ar php_admin_value.

**Kāpēc php.net PHP2Shell gadījumā iesaka memory_limit=-1?**  
Viena no ievainojamībām, CVE-2026-109618, ir saistīta ar stāvokli atmiņas trūkuma gadījumā. Saskaņā ar php.net memory_limit=-1 novērš mērķtiecīgi izraisāmu PHP atmiņas robežas sasniegšanu, bet ne katru atmiņas kļūdu. Pasākums nav pilnīga aizsardzība, un tas jākombinē ar atmiņas robežu caur konteineru vai cgroup.

**Vai robežu drīkstu tā vietā iestatīt ar ulimit?**  
Nē. php.net nepārprotami atsaka kā aizstājēju izmantot RLIMIT_AS vai RLIMIT_DATA, jo šīs robežas var izraisīt tieši ievainojamo kļūdu atmiņas pieprasīšanā. Ieteicama robeža caur konteineru vai cgroup.

**Kas spēkā pēc atjauninājuma uz labotu PHP versiju?**  
Saskaņā ar rokasgrāmatu labotajās versijās memory_limit ir mīksta robeža, ko papildina stingrā robeža caur memory_hard_limit_percent. Pārejas pasākums ar -1 tad ir izpildījis savu mērķi, un atkal jāpiemēro galīga, lietojumprogrammai piemērota vērtība.

## Avoti

- [php.net: drošības paziņojums no 21.10.2026.](https://www.php.net/)
- [PHP rokasgrāmata: kodola iestatījumi (memory_limit)](https://www.php.net/manual/en/ini.core.php)
- [PHP rokasgrāmata: FPM konfigurācija](https://www.php.net/manual/en/install.fpm.configuration.php)
