# PHP pagrindai administratoriams

> PHP pagrindai administratoriams be kūrėjo patirties: vykdomieji failai, php.ini lygiai, FPM baseinai, svarbios komandos, žurnalai ir patikros sąrašas po PHP2Shell.

Šaltinis: https://phpsos.de/lt/php/php-grundwissen-admins/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** Administratoriams be kūrėjo patirties saugiam PHP eksploatavimui pakanka penkių pagrindų: PHP sudaro kelios programos (komandinė eilutė, PHP-FPM, Apache modulis), kiekviena su sava versija; nustatymai veikia lygmenimis nuo php.ini iki programos; PHP-FPM užklausas paskirsto darbiniams procesams (worker) baseinuose; atnaujinimas pradeda veikti tik paleidus iš naujo visus procesus; o žurnalai yra svarbiausias ženklas, kai kas nors neteisinga. Kas šiuos punktus žino, tokias spragas kaip PHP2Shell gali uždaryti greitai ir įrodomai.

## Iš ko PHP sudarytas serveryje

PHP nėra viena programa. Tipiniame Linux serveryje yra keli variantai, kurie prijungiami per serverio sąsają (SAPI):

| Variantas | Tipinis pavadinimas | Kam skirta |
|---|---|---|
| Komandinė eilutė (CLI) | `php`, `php8.3` | cron užduotys, Composer, priežiūros skriptai |
| PHP-FPM | `php-fpm`, `php-fpm8.3` | žiniatinklio užklausos už Nginx ar Apache |
| Apache modulis | `mod_php`, `libphp` | žiniatinklio užklausos tiesiai Apache procese |
| CGI | `php-cgi` | senesnės sandaros |

Kiekvienas variantas gali turėti kitą versiją ir kitą php.ini. Daugelyje serverių lygiagrečiai veikia ir kelios PHP versijos, pavyzdžiui, 8.2 ir 8.4. Atnaujinant kiekvieną reikia vertinti atskirai. Kaip veikia sąsajos, paaiškina [PHP-FPM paaiškintas](https://phpsos.de/lt/php/php-fpm-erklaert/).

Kuris variantas iš tikrųjų aptarnauja jūsų svetaines, sužinosite iš veikiančių procesų ir žiniatinklio serverio konfigūracijos:

```bash
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php     # ar Apache įkelia PHP modulį?
ls /run/php/ 2>/dev/null                    # FPM lizdai (sockets), dažnai kiekvienai versijai ir baseinui
```

Stulpelis su paleidimo laiku vėliau svarbus paleidžiant iš naujo: visi PHP procesai turi būti paleisti po atnaujinimo laiko. Jei procesai veikia su skirtingais naudotojais, tai rodo atskirus baseinus, o tai gerai. Jei Apache rodomas PHP modulis, nors visos svetainės turėtų veikti per FPM, tai ženklas, kad liko senas paveldas, kurį reikia pašalinti. Hostingo sąsajoms, tokioms kaip Plesk ar cPanel, galioja tas pats principas, tik sąsaja kiekvienai svetainei rodo versijas ir tvarkykles; vis dėlto lemia tai, kas iš tikrųjų veikia kaip procesas.

## Svarbiausios komandos administratoriams

```bash
php -v                    # komandinės eilutės versija
php --ini                 # įkeltas php.ini ir papildomai skaitomi katalogai
php --ini=diff            # nuo PHP 8.5: nukrypimai nuo numatytųjų
php -m                    # sukompiliuoti ir įkelti moduliai
php --ri session          # plėtinio nustatymai
php -l datei.php          # sintaksės patikra nevykdant
php-fpm8.3 -v             # FPM vykdomojo failo versija (pavadinimas priklauso nuo distribucijos)
php-fpm8.3 -t             # FPM konfigūracijos testas be paleidimo iš naujo
systemctl status php8.3-fpm
```

Dvi vadovo pastabos: `php -l` randa sintaksės klaidas, bet ne klaidas, kurios atsiranda tik vykdant. O `php -i` iškviečia `phpinfo()`; išvestis neturi būti viešuose failuose žiniatinklio kataloge.

## Kaip veikia PHP nustatymai

Nustatymą galima nurodyti keliose vietose. Kas ką kur gali keisti, nustato kiekvienos direktyvos keitimo režimas:

1. **php.ini ir conf.d:** bazinė konfigūracija kiekvienam variantui, skaitoma paleidžiant.
2. **FPM baseinas:** `php_value` ir `php_admin_value` kiekvienam baseinui. Su `php_admin_value` nustatytų reikšmių programa, pasak vadovo, su `ini_set()` perrašyti negali.
3. **Katalogo lygis:** `.user.ini` su FPM arba `.htaccess` su mod_php, tik direktyvoms su režimu `INI_PERDIR` ar `INI_ALL`.
4. **Programa:** `ini_set()` vykdymo metu, tik direktyvoms su režimu `INI_ALL`.

Pavyzdys: `memory_limit` turi režimą `INI_ALL`, taigi programa jį gali pakeisti. `post_max_size` turi `INI_PERDIR` ir su `ini_set()` jo pakeisti negalima. Todėl php.net per PHP2Shell pereinamąsias priemones reikalauja reikšmes nustatyti taip, kad programos jų negalėtų perrašyti. Išsamiau apie lygius paaiškina [php.ini paaiškintas](https://phpsos.de/lt/php/php-ini-erklaert/).

## PHP-FPM baseinai trumpai

Baseinas yra darbinių procesų grupė su savu naudotoju, savu lizdu ir savais nustatymais. Svarbiausios direktyvos pagal vadovą:

```ini
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic                 ; static, dynamic arba ondemand
pm.max_children = 20         ; daugiausia 20 vienu metu vykdomų užklausų
pm.max_requests = 500        ; darbinį procesą atnaujinti po 500 užklausų
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on
```

Atskiras baseinas kiekvienai svetainei su savu naudotoju atskiria svetaines viena nuo kitos. `security.limit_extensions` pagal numatymą nustatytas į `.php .phar` ir neleidžia FPM vykdyti kitų nei PHP failų plėtinių. `clear_env` pagal numatymą įjungtas ir neleidžia aplinkos kintamųjų patekti pas darbinį procesą.

## Žurnalai: kur žiūrėti administratoriams

PHP klaidas rašo į tikslą, nustatytą per `error_log`, PHP-FPM papildomai į savo žurnalą, o lėtas užklausas į slowlog su atgaliniu sekimu (backtrace). Be to, yra žiniatinklio serverio prieigos ir klaidų žurnalai. Pasirūpinkite, kad produkcijoje `display_errors` būtų išjungtas, o `log_errors` įjungtas: klaidos turi būti žurnale, o ne tinklalapyje. Žurnalai taip pat turėtų būti rotuojami ir saugomi nustatytą laikotarpį, kad kritiniu atveju vis dar egzistuotų. Po PHP2Shell specializuota spauda pataria saugoti serverio žurnalus nuo 2026-10-20. Stiprus įspėjamasis ženklas yra PHP-FPM ar žiniatinklio serverio procesas, paleidžiantis shell; kaip tai atpažinti, aprašyta [Įspėjamasis ženklas: žiniatinklio serveris paleidžia shell](https://phpsos.de/lt/blog/webserver-startet-shell/).

## Administratoriaus patikros sąrašas po PHP2Shell

1. Išvardyti visus PHP variantus ir versijas serveryje, taip pat nenaudojamus.
2. Patikrinti paketo būseną; esant distribucijos backport, paketo pakeitimų žurnale ieškoti CVE-2026-109618 ir CVE-2026-109619.
3. Atnaujinti iki 8.5.12, 8.4.27, 8.3.36 ar 8.2.35 arba patvirtinto backport.
4. Paleisti iš naujo PHP-FPM, Apache ir LiteSpeed ir patikrinti procesų paleidimo laikus.
5. Kontrolinis bandymas su `php -r 'var_dump(ini_get("memory_hard_limit_percent"));'`; `bool(false)`, pasak vadovo, reiškia paveiktą versiją.
6. Išsaugoti žurnalus ir patikrinti dėl neįprastumų.

Kaip patikimai įrodyti versiją ir pataisų būseną, aprašyta [Kaip teisingai patikrinti PHP versiją ir pataisų būseną](https://phpsos.de/lt/php2shell/php-version-pruefen/).

## Kaip PHP SOS padeda konkrečiai?

Pagal [saugumo priežiūros sutartį](https://phpsos.de/lt/leistungen/security-wartungsvertrag/) PHP pagrindinę priežiūrą perimame kartu su jūsų komanda:

- **Inventorius:** visi PHP variantai, versijos, baseinai ir konfigūracijos vietos kiekviename serveryje.
- **Konfigūracija:** saugumui svarbios reikšmės nustatytos su `php_admin_value`, baseinai kiekvienai svetainei atskirti.
- **Atnaujinimai:** įdiegimas, paleidimas iš naujo, kontrolė ir dokumentavimas per kiekvieną saugumo leidimą.
- **Perduoti žinias:** paaiškiname jūsų administratoriams, ką pakeitėme ir kodėl.


## Dažni klausimai

**Kodėl php -v rodo kitą versiją nei svetainė?**  
Komandinė eilutė, PHP-FPM ir Apache modulis yra atskiros programos su sava versija ir savu php.ini. php -v rodo tik komandinę eilutę. Svetainei svarbi vykdomojo failo, kuris iš tikrųjų apdoroja užklausas, versija.

**Koks php.ini galioja mano serveryje?**  
Tai parodo php --ini komandinei eilutei. PHP-FPM dažniausiai turi savo php.ini ir papildomus baseinų failus. Nuo PHP 8.5 php --ini=diff parodo, kurios reikšmės nukrypsta nuo numatytųjų.

**Kuo skiriasi php_value ir php_admin_value?**  
Abu nustato parametrus FPM baseine. Pasak vadovo, reikšmių, nustatytų su php_admin_value, programa su ini_set() perrašyti negali. Saugumui svarbiems nustatymams todėl tinka php_admin_value.

**Ar pakanka atnaujinimo be paleidimo iš naujo?**  
Ne. Veikiantys PHP procesai laiko seną kodą atmintyje. Po atnaujinimo PHP-FPM, Apache su mod_php ar LiteSpeed reikia paleisti iš naujo, antraip toliau veikia pažeidžiama versija.

## Šaltiniai

- [PHP vadovas: komandinės eilutės parinktys](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP vadovas: FPM konfigūracija](https://www.php.net/manual/en/install.fpm.configuration.php)
- [PHP vadovas: pagrindiniai nustatymai](https://www.php.net/manual/en/ini.core.php)
- [php.net: saugumo pranešimai](https://www.php.net/)
