# Osnove PHP za skrbnike

> Osnove PHP za skrbnike brez razvijalskega ozadja: binarne datoteke, ravni php.ini, pooli FPM, pomembni ukazi, dnevniki in kontrolni seznam po PHP2Shell.

Vir: https://phpsos.de/sl/php/php-grundwissen-admins/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** Za skrbnike brez razvijalskega ozadja zadošča pet osnov za varno obratovanje PHP: PHP sestavlja več programov (ukazna vrstica, PHP-FPM, modul Apache) z vsakokrat lastno različico; nastavitve delujejo po ravneh od php.ini do aplikacije; PHP-FPM zahteve razporeja na workerje v poolih; posodobitev učinkuje šele po ponovnem zagonu vseh procesov; dnevniki pa so najpomembnejši namig, kadar kaj ne drži. Kdor te točke pozna, lahko vrzeli, kot je PHP2Shell, zapre hitro in dokazljivo.

## Iz česa je sestavljen PHP na strežniku

PHP ni en sam program. Na tipičnem strežniku Linux je več različic, vsaka je priključena prek strežniškega vmesnika (SAPI):

| Različica | Tipično ime | Za kaj |
|---|---|---|
| Ukazna vrstica (CLI) | `php`, `php8.3` | cronjobi, Composer, vzdrževalne skripte |
| PHP-FPM | `php-fpm`, `php-fpm8.3` | spletne zahteve za Nginxom ali Apacheem |
| Modul Apache | `mod_php`, `libphp` | spletne zahteve neposredno v procesu Apache |
| CGI | `php-cgi` | starejše postavitve |

Vsaka različica ima lahko drugo različico in drug php.ini. Na številnih strežnikih poleg tega vzporedno teče več različic PHP, na primer 8.2 in 8.4. Pri posodobitvi je treba vsako obravnavati posebej. Kako vmesniki delujejo, razlaga [PHP-FPM razložen](https://phpsos.de/sl/php/php-fpm-erklaert/).

Katera različica dejansko streže vašim spletnim stranem, ugotovite prek tekočih procesov in konfiguracije spletnega strežnika:

```bash
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php     # ali Apache nalaga modul PHP?
ls /run/php/ 2>/dev/null                    # vtiči FPM, pogosto po različici in poolu
```

Stolpec s časom zagona je pozneje pri ponovnem zagonu pomemben: vsi procesi PHP morajo biti zagnani po času posodobitve. Če procesi tečejo pod različnimi uporabniki, to kaže na ločene poole, kar je dobro. Če se v Apacheu pojavi modul PHP, čeprav naj bi vse spletne strani tekle prek FPM, je to namig na staro breme, ki ga je treba odstraniti. Za gostiteljske vmesnike, kot sta Plesk ali cPanel, velja isto načelo, le da vmesnik prikazuje različice in handlerje po spletnih straneh; merodajno pa ostane to, kar dejansko teče kot proces.

## Najpomembnejši ukazi za skrbnike

```bash
php -v                    # različica ukazne vrstice
php --ini                 # naložen php.ini in dodatno prebrani imeniki
php --ini=diff            # od PHP 8.5: odstopanja od privzetih vrednosti
php -m                    # vkompilirani in naloženi moduli
php --ri session          # nastavitve razširitve
php -l datei.php          # preverjanje sintakse brez izvajanja
php-fpm8.3 -v             # različica binarne datoteke FPM (ime glede na distribucijo)
php-fpm8.3 -t             # preizkus konfiguracije FPM brez ponovnega zagona
systemctl status php8.3-fpm
```

Dva namiga iz priročnika: `php -l` najde sintaktične napake, ne pa napak, ki nastanejo šele med izvajanjem. In `php -i` pokliče `phpinfo()`; izpis ne sodi v javne datoteke v spletnem imeniku.

## Kako delujejo nastavitve PHP

Nastavitev je mogoče določiti na več mestih. Kdo sme kje kaj spremeniti, ureja način spremembe vsake direktive:

1. **php.ini in conf.d:** osnovna konfiguracija po različici, prebrana ob zagonu.
2. **Pool FPM:** `php_value` in `php_admin_value` po poolu. Vrednosti, nastavljenih s `php_admin_value`, aplikacija po priročniku ne more prepisati z `ini_set()`.
3. **Raven imenika:** `.user.ini` pri FPM ali `.htaccess` pri mod_php, samo za direktive v načinu `INI_PERDIR` ali `INI_ALL`.
4. **Aplikacija:** `ini_set()` med izvajanjem, samo za direktive v načinu `INI_ALL`.

Primer: `memory_limit` ima način `INI_ALL`, aplikacija ga torej lahko spremeni. `post_max_size` ima `INI_PERDIR` in ga ni mogoče spremeniti z `ini_set()`. Zato php.net pri prehodnih ukrepih za PHP2Shell zahteva, da se vrednosti nastavijo tako, da jih aplikacije ne morejo prepisati. Podrobnosti o ravneh razlaga [php.ini razložen](https://phpsos.de/sl/php/php-ini-erklaert/).

## Pooli PHP-FPM na kratko

Pool je skupina workerjev z lastnim uporabnikom, lastnim vtičem (socket) in lastnimi nastavitvami. Najpomembnejše direktive po priročniku:

```ini
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic                 ; static, dynamic ali ondemand
pm.max_children = 20         ; največ 20 hkratnih zahtev
pm.max_requests = 500        ; workerja obnoviti po 500 zahtevah
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
```

Lasten pool na spletno stran z lastnim uporabnikom spletne strani med seboj loči. `security.limit_extensions` je privzeto `.php .phar` in preprečuje, da bi FPM izvajal druge končnice datotek kot PHP. `clear_env` je privzeto vklopljen in spremenljivke okolja drži stran od workerja.

## Dnevniki: kam naj gledajo skrbniki

PHP napake zapisuje v cilj, določen z `error_log`, PHP-FPM dodatno v svoj dnevnik, pri počasnih zahtevah pa v slowlog s sledjo klicev (backtrace). Zraven pridejo dnevniki dostopov in napak spletnega strežnika. Pazite, da je `display_errors` v produkciji izklopljen in `log_errors` vklopljen: napake sodijo v dnevnik, ne na spletno stran. Dnevnike je poleg tega treba rotirati in hraniti določen čas, da so v resnem primeru še na voljo. Po PHP2Shell strokovni tisk priporoča hranjenje dnevnikov strežnika od 20. 10. 2026. Močan opozorilni znak je proces PHP-FPM ali spletnega strežnika, ki zažene lupino; kako to prepoznate, je pod [Opozorilni znak: spletni strežnik zažene lupino](https://phpsos.de/sl/blog/webserver-startet-shell/).

## Kontrolni seznam za skrbnike po PHP2Shell

1. Našteti vse različice in izdaje PHP na strežniku, tudi tiste, ki se ne uporabljajo.
2. Preveriti stanje paketov; pri backportih distribucije v dnevniku sprememb poiskati CVE-2026-109618 in CVE-2026-109619.
3. Posodobiti na 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma potrjeni backport.
4. Znova zagnati PHP-FPM, Apache in LiteSpeed ter preveriti čase zagona procesov.
5. Kontrolni preizkus s `php -r 'var_dump(ini_get("memory_hard_limit_percent"));'`; `bool(false)` po priročniku pomeni prizadeto različico.
6. Zavarovati dnevnike in jih preveriti glede nepravilnosti.

Kako različico in stanje popravkov zanesljivo dokažete, opisuje [Pravilno preverjanje različice PHP in stanja popravkov](https://phpsos.de/sl/php2shell/php-version-pruefen/).

## Kako PHP SOS pomaga konkretno?

V [varnostni vzdrževalni pogodbi](https://phpsos.de/sl/leistungen/security-wartungsvertrag/) osnovno vzdrževanje PHP prevzamemo skupaj z vašo ekipo:

- **Popis:** vse različice PHP, izdaje, pooli in mesta konfiguracije po strežnikih.
- **Konfiguracija:** varnostno pomembne vrednosti nastavljene s `php_admin_value`, pooli ločeni po spletnih straneh.
- **Posodobitve:** namestitev, ponovni zagon, kontrola in dokumentacija ob vsaki varnostni izdaji.
- **Prenos znanja:** vašim skrbnikom razložimo, kaj smo spremenili in zakaj.


## Pogosta vprašanja

**Zakaj php -v prikaže drugo različico kot spletna stran?**  
Ukazna vrstica, PHP-FPM in modul Apache so ločeni programi z lastno različico in lastnim php.ini. php -v prikaže samo ukazno vrstico. Za spletno stran šteje različica binarne datoteke, ki dejansko obdeluje zahteve.

**Kateri php.ini velja na mojem strežniku?**  
To pokaže php --ini za ukazno vrstico. Za PHP-FPM je praviloma lasten php.ini in dodatne datoteke poolov. Od PHP 8.5 php --ini=diff pokaže, katere vrednosti odstopajo od privzetih.

**Kakšna je razlika med php_value in php_admin_value?**  
Oba nastavita vrednosti v poolu FPM. Vrednosti s php_admin_value aplikacija po priročniku ne more prepisati z ini_set(). Za varnostno pomembne nastavitve je zato php_admin_value prava izbira.

**Ali zadošča posodobitev brez ponovnega zagona?**  
Ne. Tekoči procesi PHP obdržijo staro kodo v pomnilniku. Po posodobitvi je treba znova zagnati PHP-FPM, Apache z mod_php ali LiteSpeed, sicer ranljiva različica teče naprej.

## Viri

- [Priročnik PHP: možnosti ukazne vrstice](https://www.php.net/manual/en/features.commandline.options.php)
- [Priročnik PHP: konfiguracija FPM](https://www.php.net/manual/en/install.fpm.configuration.php)
- [Priročnik PHP: osnovne nastavitve](https://www.php.net/manual/en/ini.core.php)
- [php.net: varnostna obvestila](https://www.php.net/)
