# Základy PHP pre administrátorov

> Základy PHP pre adminov bez vývojárskeho zázemia: binárky, úrovne php.ini, pooly FPM, dôležité príkazy, logy a kontrolný zoznam po PHP2Shell.

Zdroj: https://phpsos.de/sk/php/php-grundwissen-admins/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Pre adminov bez vývojárskeho zázemia stačí na bezpečnú prevádzku PHP päť základov: PHP pozostáva z viacerých programov (príkazový riadok, PHP-FPM, modul Apache), z ktorých každý má vlastnú verziu; nastavenia pôsobia v úrovniach od php.ini až po aplikáciu; PHP-FPM rozdeľuje požiadavky na workerov v poolach; aktualizácia zaberie až po reštarte všetkých procesov; a logy sú najdôležitejším signálom, keď niečo nesedí. Kto tieto body pozná, dokáže zraniteľnosti ako PHP2Shell uzavrieť rýchlo a preukázateľne.

## Z čoho PHP na serveri pozostáva

PHP nie je jediný program. Na typickom serveri s Linuxom sa nachádza viac variantov, z ktorých každý je pripojený cez serverové rozhranie (SAPI):

| Variant | Typický názov | Na čo |
|---|---|---|
| Príkazový riadok (CLI) | `php`, `php8.3` | cronjoby, Composer, údržbové skripty |
| PHP-FPM | `php-fpm`, `php-fpm8.3` | webové požiadavky za Nginx alebo Apache |
| Modul Apache | `mod_php`, `libphp` | webové požiadavky priamo v procese Apache |
| CGI | `php-cgi` | staršie nasadenia |

Každý variant môže mať inú verziu a iný php.ini. Na mnohých serveroch navyše paralelne beží viac verzií PHP, napríklad 8.2 a 8.4. Pri aktualizácii sa musí každá posudzovať zvlášť. Ako rozhrania fungujú, vysvetľuje [PHP-FPM vysvetlené](https://phpsos.de/sk/php/php-fpm-erklaert/).

Ktorý variant vaše weby skutočne obsluhuje, zistíte z bežiacich procesov a z konfigurácie webového servera:

```bash
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php     # načíta Apache modul PHP?
ls /run/php/ 2>/dev/null                    # sockety FPM, často na verziu a pool
```

Stĺpec s časom štartu je neskôr pri reštarte dôležitý: všetky procesy PHP musia byť spustené po čase aktualizácie. Ak procesy bežia pod rôznymi používateľmi, naznačuje to oddelené pooly, čo je dobré. Ak sa v Apache objaví modul PHP, hoci majú všetky weby bežať cez FPM, je to náznak starého bremena, ktoré treba odstrániť. Pre hostingové rozhrania ako Plesk alebo cPanel platí ten istý princíp, len rozhranie ukazuje verzie a handlery pre každý web; rozhodujúce však zostáva to, čo skutočne beží ako proces.

## Najdôležitejšie príkazy pre adminov

```bash
php -v                    # verzia príkazového riadku
php --ini                 # načítaný php.ini a dodatočne čítané adresáre
php --ini=diff            # od PHP 8.5: odchýlky od štandardu
php -m                    # zakompilované a načítané moduly
php --ri session          # nastavenia rozšírenia
php -l datei.php          # kontrola syntaxe bez spustenia
php-fpm8.3 -v             # verzia binárky FPM (názov podľa distribúcie)
php-fpm8.3 -t             # otestovať konfiguráciu FPM bez reštartu
systemctl status php8.3-fpm
```

Dve poznámky z príručky: `php -l` nájde syntaktické chyby, ale nie chyby, ktoré nastanú až pri vykonávaní. A `php -i` volá `phpinfo()`; jeho výstup nepatrí do verejných súborov vo webovom adresári.

## Ako pôsobia nastavenia PHP

Nastavenie sa môže určiť na viacerých miestach. Kto smie kde čo meniť, upravuje režim zmeny každej direktívy:

1. **php.ini a conf.d:** základná konfigurácia pre každý variant, číta sa pri štarte.
2. **Pool FPM:** `php_value` a `php_admin_value` pre každý pool. Hodnoty nastavené pomocou `php_admin_value` aplikácia podľa príručky nemôže prepísať cez `ini_set()`.
3. **Úroveň adresára:** `.user.ini` pri FPM alebo `.htaccess` pri mod_php, iba pre direktívy v režime `INI_PERDIR` alebo `INI_ALL`.
4. **Aplikácia:** `ini_set()` za behu, iba pre direktívy v režime `INI_ALL`.

Príklad: `memory_limit` má režim `INI_ALL`, aplikácia ho teda môže zmeniť. `post_max_size` má `INI_PERDIR` a pomocou `ini_set()` sa zmeniť nedá. Preto php.net pri prechodných opatreniach PHP2Shell vyžaduje nastavovať hodnoty tak, aby ich aplikácie nemohli prepísať. Podrobnosti o úrovniach vysvetľuje [php.ini vysvetlený](https://phpsos.de/sk/php/php-ini-erklaert/).

## Pooly PHP-FPM v kocke

Pool je skupina workerov s vlastným používateľom, vlastným socketom a vlastnými nastaveniami. Najdôležitejšie direktívy podľa príručky:

```ini
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic                 ; static, dynamic alebo ondemand
pm.max_children = 20         ; najviac 20 súčasných požiadaviek
pm.max_requests = 500        ; obnoviť worker po 500 požiadavkách
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
```

Vlastný pool pre každý web s vlastným používateľom oddeľuje weby navzájom. `security.limit_extensions` je štandardne nastavené na `.php .phar` a bráni tomu, aby FPM vykonával iné prípony súborov než PHP. `clear_env` je štandardne zapnuté a drží premenné prostredia mimo workera.

## Logy: kam sa admini majú pozerať

PHP zapisuje chyby do cieľa určeného pomocou `error_log`, PHP-FPM navyše do vlastného logu a pri pomalých požiadavkách do slowlogu s backtrace. K tomu pribúdajú prístupové logy a logy chýb webového servera. Dbajte na to, aby bolo `display_errors` v produkcii vypnuté a `log_errors` zapnuté: chyby patria do logu, nie na webovú stránku. Logy by sa mali navyše rotovať a uchovávať počas stanoveného obdobia, aby v kritickom prípade ešte existovali. Po PHP2Shell odborná tlač odporúča uchovávať logy servera od 20. 10. 2026. Silným varovným signálom je proces PHP-FPM alebo webového servera, ktorý spustí shell; ako to rozpoznať, je uvedené v [Varovný signál: webový server spúšťa shell](https://phpsos.de/sk/blog/webserver-startet-shell/).

## Kontrolný zoznam pre adminov po PHP2Shell

1. Vypísať všetky varianty a verzie PHP na serveri, aj nepoužívané.
2. Skontrolovať stav balíkov; pri backportoch distribúcie prehľadať changelog na CVE-2026-109618 a CVE-2026-109619.
3. Aktualizovať na 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35, resp. potvrdený backport.
4. Reštartovať PHP-FPM, Apache a LiteSpeed a skontrolovať časy štartu procesov.
5. Protikontrola pomocou `php -r 'var_dump(ini_get("memory_hard_limit_percent"));'`; `bool(false)` znamená podľa príručky dotknutú verziu.
6. Zálohovať logy a skontrolovať ich na nezrovnalosti.

Ako spoľahlivo preukázať verziu a stav záplat, opisuje [Správna kontrola verzie PHP a stavu záplat](https://phpsos.de/sk/php2shell/php-version-pruefen/).

## Ako PHP SOS konkrétne pomáha?

V [zmluve o bezpečnostnej údržbe](https://phpsos.de/sk/leistungen/security-wartungsvertrag/) preberáme základnú starostlivosť o PHP spolu s vaším tímom:

- **Inventár:** všetky varianty PHP, verzie, pooly a miesta konfigurácie pre každý server.
- **Konfigurácia:** bezpečnostne relevantné hodnoty nastavené pomocou `php_admin_value`, pooly oddelené pre každý web.
- **Aktualizácie:** nasadenie, reštart, kontrola a dokumentácia pri každom bezpečnostnom vydaní.
- **Odovzdávanie znalostí:** Vašim adminom vysvetľujeme, čo sme zmenili a prečo.


## Časté otázky

**Prečo php -v ukazuje inú verziu než web?**  
Príkazový riadok, PHP-FPM a modul Apache sú oddelené programy s vlastnou verziou a vlastným php.ini. php -v ukazuje iba príkazový riadok. Pre web je rozhodujúca verzia binárky, ktorá skutočne vybavuje požiadavky.

**Ktorý php.ini platí na mojom serveri?**  
To ukáže php --ini pre príkazový riadok. Pre PHP-FPM existuje zvyčajne vlastný php.ini a ďalšie súbory poolov. Od PHP 8.5 ukazuje php --ini=diff, ktoré hodnoty sa líšia od štandardu.

**Aký je rozdiel medzi php_value a php_admin_value?**  
Obe nastavujú hodnoty v poole FPM. Hodnoty nastavené pomocou php_admin_value aplikácia podľa príručky nemôže prepísať pomocou ini_set(). Pre bezpečnostne relevantné nastavenia je preto php_admin_value správna voľba.

**Stačí aktualizácia bez reštartu?**  
Nie. Bežiace procesy PHP si ponechávajú starý kód v pamäti. Po aktualizácii sa musia reštartovať PHP-FPM, Apache s mod_php alebo LiteSpeed, inak naďalej beží zraniteľná verzia.

## Zdroje

- [Príručka PHP: Voľby príkazového riadku](https://www.php.net/manual/en/features.commandline.options.php)
- [Príručka PHP: Konfigurácia FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Príručka PHP: Základné nastavenia](https://www.php.net/manual/en/ini.core.php)
- [php.net: Bezpečnostné oznámenia](https://www.php.net/)
