Cum să Reporniți PHP-FPM: Fiecare Metodă Explicată pentru Administratorii Linux
PHP-FPM (PHP FastCGI Process Manager) este un manager de procese de înaltă performanță care gestionează execuția PHP ca un serviciu separat, decuplat de serverul web. Repornirea PHP-FPM aplică modificările de configurare din `php.ini` sau `php-fpm.conf`, recuperează memoria scursă în pool-urile de lucru cu rulare îndelungată și recuperează procesele copil care nu răspund — toate fără a atinge Nginx, Apache sau orice altă componentă a stivei tale.
Acest ghid acoperă fiecare metodă practică de repornire disponibilă pe distribuțiile Linux moderne și vechi, inclusiv controlul bazat pe semnale, mediile cu mai multe versiuni și strategiile de reîncărcare gracioasă pentru implementări în producție fără timp de nefuncționare.
De ce trebuie să repornești PHP-FPM
Înțelegerea declanșatorului exact pentru o repornire previne timpii de nefuncționare inutili și te ajută să alegi metoda cea mai puțin perturbatoare:
- Modificări de configurare: Modificările la `php.ini`, `php-fpm.conf` sau orice fișier de configurare a pool-ului din `/etc/php/<version>/fpm/pool.d/` necesită o repornire sau reîncărcare pentru a intra în vigoare. PHP-FPM citește aceste fișiere doar la pornire sau la un semnal `USR2`.
- Recuperarea memoriei: Procesele worker PHP-FPM acumulează memorie în timp, în special pe serverele cu trafic intens care rulează aplicații intensive în memorie. O repornire controlată reciclează workerii și resetează amprenta lor de memorie.
- Workeri care nu răspund: Dacă procesele copil intră într-o stare zombie sau încetează să accepte conexiuni, o repornire curăță tabelul de procese și generează un pool nou.
- Rotația jurnalelor: După ce `logrotate` redenumește sau comprimă fișierul jurnal activ, PHP-FPM încă deține un descriptor de fișier pentru vechiul inode. O reîncărcare îl forțează să deschidă noul descriptor de fișier, asigurând continuitatea jurnalelor.
- Invalidarea OPcache: La implementarea unui nou cod de aplicație, repornirea PHP-FPM golește complet OPcache, garantând că workerii execută bytecode-ul actualizat în loc de versiunile cache stale.
- Modificări de extensii sau module: Adăugarea sau eliminarea extensiilor PHP în `php.ini` necesită o repornire completă — o simplă reîncărcare este insuficientă deoarece lista de extensii este evaluată la inițializarea procesului.
Cerințe preliminare
Înainte de a executa orice comandă de repornire, confirmă următoarele:
- Ai acces `root` sau privilegii `sudo` pe server.
- Cunoști numele exact al serviciului PHP-FPM pe sistemul tău (variază în funcție de distribuție și versiunea instalată).
- Ai identificat calea fișierului PID dacă plănuiești să folosești controlul bazat pe semnale (de obicei `/run/php/php<version>-fpm.pid` pe Debian/Ubuntu sau `/run/php-fpm/php-fpm.pid` pe RHEL/CentOS).
Pentru a descoperi numele activ al serviciului PHP-FPM:
“`bash
systemctl list-units –type=service | grep fpm
“`
Pentru a localiza calea fișierului PID:
“`bash
grep -i pid /etc/php/*/fpm/php-fpm.conf
“`
Metoda 1: Repornirea PHP-FPM cu systemctl (Recomandat)
`systemctl` este managerul de servicii autorizat pe toate distribuțiile bazate pe systemd, inclusiv Ubuntu 16.04+, Debian 8+, CentOS 7+, AlmaLinux, Rocky Linux și Fedora. Este instrumentul corect pentru marea majoritate a serverelor de producție.
Repornire standard
“`bash
sudo systemctl restart php8.2-fpm
“`
Înlocuiește `php8.2-fpm` cu versiunea instalată pe sistemul tău (ex., `php7.4-fpm`, `php8.1-fpm`, `php-fpm`). Pe sistemele bazate pe RHEL, serviciul este de obicei numit `php-fpm` fără prefix de versiune.
Reîncărcare fără repornire completă
O reîncărcare trimite intern un semnal `USR2`, instruind procesul master să recitească configurația și să înlocuiască gracios procesele worker. Cererile în zbor existente sunt finalizate înainte ca workerii să fie reciclați:
“`bash
sudo systemctl reload php8.2-fpm
“`
Distincție critică: `reload` este non-perturbator și preferat pentru modificările de configurare în producție. `restart` termină imediat toți workerii, ceea ce poate abandona conexiunile active în condiții de concurență ridicată.
Oprire și pornire separat
“`bash
sudo systemctl stop php8.2-fpm
sudo systemctl start php8.2-fpm
“`
Folosește această abordare în doi pași când trebuie să confirmi că serviciul este complet oprit înainte de a-l reporni — de exemplu, după schimbarea căii socket-ului `listen` sau modificarea semnificativă a `pm.max_children`.
Verificarea stării serviciului
“`bash
sudo systemctl status php8.2-fpm
“`
O ieșire sănătoasă arată `Active: active (running)` și listează PID-ul master. Dacă serviciul nu a reușit să pornească, `systemctl status` afișează ultimele intrări din jurnal, ceea ce este mai rapid decât căutarea manuală prin fișierele jurnal.
Pentru a transmite jurnale live în timpul unei reporniri:
“`bash
sudo journalctl -u php8.2-fpm -f
“`
Metoda 2: Repornirea PHP-FPM cu comanda service moștenită
Comanda `service` este un wrapper de compatibilitate în jurul `systemctl` pe sistemele moderne și invocă direct scripturile SysVinit pe distribuțiile mai vechi (Ubuntu 14.04, CentOS 6, Debian 7). Rămâne relevantă la gestionarea serverelor care nu au fost migrate la systemd.
“`bash
sudo service php-fpm restart
“`
Pentru a opri și porni independent:
“`bash
sudo service php-fpm stop
sudo service php-fpm start
“`
Pe distribuțiile care încă folosesc SysVinit, scriptul de bază se află la `/etc/init.d/php-fpm`. Îl poți invoca direct dacă wrapper-ul `service` nu este disponibil:
“`bash
sudo /etc/init.d/php-fpm restart
“`
Metoda 3: Gestionarea mai multor versiuni PHP simultan
Serverele care rulează panouri de control precum cPanel, Plesk sau configurații personalizate multi-tenant au frecvent mai multe versiuni PHP instalate în paralel. Fiecare versiune rulează ca un serviciu PHP-FPM independent cu propriul arbore de configurare, socket și fișier PID.
Repornirea unei versiuni specifice
“`bash
Debian/Ubuntu (packages from ondrej/php PPA or distribution repos)
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
sudo systemctl restart php8.2-fpm
RHEL/CentOS with Remi repository
sudo systemctl restart php74-php-fpm
sudo systemctl restart php81-php-fpm
“`
Repornirea tuturor versiunilor PHP-FPM simultan
Când o modificare la nivel de sistem afectează toate versiunile (cum ar fi o actualizare a bibliotecii partajate), repornește toate instanțele cu o singură buclă:
“`bash
for ver in 7.4 8.1 8.2; do
sudo systemctl restart php${ver}-fpm && echo "php${ver}-fpm restarted"
done
“`
Identificarea versiunii care servește un site specific
Fiecare gazdă virtuală Nginx sau VirtualHost Apache se mapează la un socket PHP-FPM specific. Verifică configurația site-ului pentru a determina ce versiune este activă înainte de repornire:
“`bash
Nginx
grep fastcgi_pass /etc/nginx/sites-enabled/yourdomain.conf
Apache with mod_proxy_fcgi
grep SetHandler /etc/apache2/sites-enabled/yourdomain.conf
“`
Dacă îți gestionezi serverul printr-un panou de control, VPS cu cPanel oferă o interfață grafică pentru schimbarea versiunilor PHP per domeniu fără reporniri manuale ale serviciului.
Metoda 4: Trimiterea semnalelor POSIX direct la procesul master
Procesul master PHP-FPM răspunde la un set definit de semnale POSIX. Această metodă ocolește complet sistemul init și îți oferă control precis, la nivel scăzut — esențial în mediile containerizate, sistemele init personalizate sau când `systemctl` nu este disponibil.
Tabel de referință pentru semnale
| Semnal | Efect | Caz de utilizare |
|---|
| — | — | — |
|---|
| `SIGTERM` (15) | Oprire gracioasă | Oprire ordonată, așteaptă finalizarea workerilor |
|---|
| `SIGINT` (2) | Oprire imediată | Oprire forțată când oprirea gracioasă se blochează |
|---|
| `SIGQUIT` (3) | Oprire gracioasă | Echivalent cu SIGTERM pentru PHP-FPM |
|---|
| `SIGUSR1` (10) | Redeschidere fișiere jurnal | Reîmprospătarea descriptorului de fișier jurnal după logrotate |
|---|
| `SIGUSR2` (12) | Reîncărcare gracioasă | Reîncarcă configurația, reciclează workerii fără a abandona conexiunile |
|---|
| `SIGKILL` (9) | Terminare forțată | Ultimă soluție — fără curățare, fără gestionare gracioasă |
|---|
Reîncărcarea configurației (fără timp de nefuncționare)
“`bash
sudo kill -USR2 $(cat /run/php/php8.2-fpm.pid)
“`
Aceasta este echivalentă funcțional cu `systemctl reload` și este cea mai sigură modalitate de a aplica modificările de configurare `php-fpm.conf` sau ale pool-ului pe un server live.
Redeschiderea fișierelor jurnal după rotație
“`bash
sudo kill -USR1 $(cat /run/php/php8.2-fpm.pid)
“`
Rulează aceasta imediat după ce `logrotate` se execută pentru a preveni ca PHP-FPM să continue să scrie în fișierul jurnal redenumit.
Oprire gracioasă
“`bash
sudo kill -QUIT $(cat /run/php/php8.2-fpm.pid)
“`
Procesul master încetează să accepte conexiuni noi și așteaptă ca toți workerii activi să finalizeze cererile curente înainte de ieșire. Urmează aceasta cu `sudo systemctl start php8.2-fpm` pentru a readuce serviciul online.
Important: Verifică întotdeauna calea fișierului PID înainte de a folosi aceste comenzi. O cale incorectă duce la trimiterea unui semnal unui proces fără legătură. Confirmă cu:
“`bash
cat /run/php/php8.2-fpm.pid
ps aux | grep php-fpm
“`
Metoda 5: Terminarea forțată a proceselor PHP-FPM cu pkill sau killall
Aceasta este o metodă de ultimă soluție pentru situațiile în care PHP-FPM a devenit complet iresponsiv și nici `systemctl` nici controlul bazat pe semnale nu produc rezultate. Termină toate procesele PHP-FPM necondiționat, ceea ce va întrerupe orice cereri în zbor.
“`bash
sudo pkill -9 php-fpm
“`
Sau folosind `killall`:
“`bash
sudo killall -9 php-fpm
“`
După terminarea forțată, serviciul nu va reporni automat dacă nu este gestionat de un supervizor de procese. Pornește-l explicit:
“`bash
sudo systemctl start php8.2-fpm
“`
Când să folosești aceasta: Acumularea de procese zombie, procese copil scăpate de sub control care consumă 100% CPU sau situații în care procesul master este activ dar nu mai gestionează pool-ul. Înainte de a apela la `pkill -9`, încearcă `kill -QUIT` pe PID-ul master mai întâi — este mult mai puțin perturbator.
Metoda 6: Repornirea serverului web pentru a afecta indirect PHP-FPM
Repornirea Nginx sau Apache nu repornește PHP-FPM. Deoarece PHP-FPM rulează ca un serviciu complet independent care comunică printr-un socket Unix sau port TCP, repornirea serverului web afectează doar stratul HTTP. Aceasta este o concepție greșită comună.
“`bash
Nginx
sudo systemctl restart nginx
Apache
sudo systemctl restart apache2
“`
Singurul scenariu în care o repornire a serverului web este relevantă pentru PHP-FPM este când ai modificat directiva `fastcgi_pass` în Nginx sau regula `ProxyPassMatch` în Apache pentru a indica un socket PHP-FPM diferit. În acel caz, Nginx trebuie să-și reîncarce configurația pentru a se conecta la noua cale a socket-ului — dar PHP-FPM însuși are nevoie în continuare de propria sa repornire separată.
Pentru întreținerea întregii stive, repornește ambele servicii în ordinea corectă: PHP-FPM primul, apoi serverul web.
Comparație: Metodele de repornire PHP-FPM dintr-o privire
| Metodă | Exemplu de comandă | Nivel de perturbare | Caz de utilizare |
|---|
| — | — | — | — |
|---|
| `systemctl restart` | `systemctl restart php8.2-fpm` | Mediu — abandonează conexiunile active | Modificări standard de configurare, dev/staging |
|---|
| `systemctl reload` | `systemctl reload php8.2-fpm` | Niciunul — reciclare gracioasă a workerilor | Modificări de configurare în producție |
|---|
| `kill -USR2` | `kill -USR2 $(cat /run/php/php-fpm.pid)` | Niciunul — reîncărcare gracioasă | Producție, medii containerizate |
|---|
| `kill -QUIT` | `kill -QUIT $(cat /run/php/php-fpm.pid)` | Scăzut — așteaptă finalizarea cererilor | Oprire controlată înainte de întreținere |
|---|
| `kill -USR1` | `kill -USR1 $(cat /run/php/php-fpm.pid)` | Niciunul — doar reîmprospătare FD jurnal | Post-logrotate |
|---|
| `service restart` | `service php-fpm restart` | Mediu | Sisteme SysVinit moștenite |
|---|
| `pkill -9` | `pkill -9 php-fpm` | Ridicat — terminare imediată | Procese iresponsive, ultimă soluție |
|---|
| Repornire server web | `systemctl restart nginx` | Doar stratul web | Actualizarea căii socket-ului fastcgi în configurația serverului web |
|---|
Configurarea pool-ului PHP-FPM: Ce necesită repornire față de reîncărcare
Nu toate modificările de configurare au aceeași greutate. Știind ce modificări necesită o repornire completă față de o simplă reîncărcare reduce timpii de nefuncționare inutili:
Reîncărcarea (`USR2` / `systemctl reload`) este suficientă pentru:
- `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers`
- `request_terminate_timeout`, `request_slowlog_timeout`
- Modificări ale căii `slowlog`
- Directivele `php_admin_value` și `php_flag` din fișierele pool
- Modificări ale căii `access.log`
Repornire completă necesară pentru:
- Modificări ale directivei `listen` (cale socket sau port TCP)
- Adăugarea sau eliminarea extensiilor PHP în `php.ini`
- Schimbarea directivelor `user` sau `group` din pool
- Modificarea căilor `include` în `php-fpm.conf`
- Actualizarea binarului PHP însuși (actualizări de versiune)
Bune practici pentru repornirile PHP-FPM în producție
- Preferă întotdeauna `reload` față de `restart` pe serverele live. O reîncărcare reciclează workerii gracios, finalizând cererile în zbor înainte de a genera înlocuitori. O repornire dură abandonează imediat toate conexiunile active.
- Validează configurația înainte de reîncărcare. PHP-FPM oferă o verificare de sintaxă încorporată care previne încărcarea unei configurații defecte:
“`bash
sudo php-fpm8.2 -t
Expected output: NOTICE: configuration file … test is successful
“`
- Verifică jurnalele înainte și după. Revizuiește `/var/log/php8.2-fpm.log` (sau calea definită în `php-fpm.conf`) pentru intrări `WARNING` sau `ERROR` care indică eșecuri la pornirea pool-ului.
- Monitorizează metricile pool-ului de workeri după repornire. Folosește pagina de stare PHP-FPM (activată prin `pm.status_path` în configurația pool-ului) pentru a verifica că numărul așteptat de workeri sunt activi și inactivi după repornire.
- Automatizează cu pipeline-uri de implementare. În fluxurile CI/CD, declanșează `systemctl reload php-fpm` ca un hook post-deploy în loc de o repornire completă. Aceasta asigură implementări fără timp de nefuncționare la fiecare push de cod.
- Setează `pm.max_requests` pentru reciclarea automată a workerilor. În loc să programezi reporniri periodice pentru a combate scurgerile de memorie, configurează `pm.max_requests = 500` (sau o valoare adecvată) pentru a reporni automat fiecare worker după servirea unui număr fix de cereri.
PHP-FPM pe medii VPS și server dedicat
Metoda de repornire pe care o folosești este influențată și de mediul tău de hosting. Pe un plan de VPS Hosting cu acces root complet, toate metodele descrise în acest ghid sunt disponibile fără restricții. Ai acces direct la `systemctl`, fișierul PID și tabelul de procese.
Pe Servere Dedicate, unde controlezi întreaga stivă hardware, poți configura suplimentar PHP-FPM cu `pm = ondemand` sau `pm = dynamic` pentru a ajusta precis comportamentul de generare a workerilor și poți folosi fișierele drop-in `systemd` pentru a personaliza politicile de repornire (ex., `Restart=on-failure`, `RestartSec=5s`).
Dacă gestionezi mai multe site-uri de clienți printr-o soluție de Panouri de Control VPS, operațiunile de repornire PHP-FPM sunt adesea abstractizate în interfața UI a panoului, dar înțelegerea comenzilor de bază rămâne esențială pentru scenariile de depanare în care panoul însuși nu răspunde.
Pentru aplicațiile care necesită concurență PHP ridicată — cum ar fi Laravel, WordPress multisite sau magazinele WooCommerce — asocierea PHP-FPM cu o configurație de pool bine ajustată pe un Server Dedicat elimină contenciunea de resurse pe care o introduc mediile partajate.
Matricea de decizie tehnică: Alegerea metodei corecte de repornire
Folosește această matrice pentru a selecta abordarea corectă în funcție de situația ta specifică:
| Situație | Metodă recomandată |
|---|
| — | — |
|---|
| Modificări aplicate la `php.ini` sau fișierele pool `.conf` | `systemctl reload php<ver>-fpm` |
|---|
| Adăugat o nouă extensie PHP | `systemctl restart php<ver>-fpm` |
|---|
| PHP-FPM nu răspunde, procesul master activ | `kill -QUIT <master_pid>`, apoi `systemctl start` |
|---|
| PHP-FPM este complet înghețat, fără răspuns la semnale | `pkill -9 php-fpm`, apoi `systemctl start` |
|---|
| Reîmprospătare fișier jurnal post-logrotate | `kill -USR1 <master_pid>` |
|---|
| Implementarea unui nou cod de aplicație (golire OPcache) | `systemctl reload php<ver>-fpm` sau `kill -USR2` |
|---|
| Schimbată calea socket-ului `listen` | `systemctl restart php<ver>-fpm` |
|---|
| Mai multe versiuni PHP, una necesită actualizare | Doar `systemctl restart php<specific-ver>-fpm` |
|---|
| Mediu containerizat fără systemd | `kill -USR2 <master_pid>` prin scriptul entrypoint |
|---|
| Verificarea sintaxei configurației înainte de aplicare | `php-fpm<ver> -t` mai întâi, apoi reîncărcare/repornire |
|---|
Întrebări frecvente
Care este diferența dintre `systemctl restart` și `systemctl reload` pentru PHP-FPM?
`restart` termină imediat toate procesele master și worker și pornește din nou, abandonând orice cereri în zbor. `reload` trimite un semnal `USR2` procesului master, care generează workeri noi cu configurația actualizată în timp ce workerii existenți își finalizează cererile curente înainte de ieșire. Folosește întotdeauna `reload` în producție.
Cum găsesc numele corect al serviciului PHP-FPM pe serverul meu?
Rulează `systemctl list-units –type=service | grep fpm`. Pe sistemele Debian/Ubuntu cu mai multe versiuni din PPA-ul `ondrej/php`, vei vedea intrări precum `php7.4-fpm.service` și `php8.2-fpm.service`. Pe RHEL/CentOS cu repository-ul Remi, convenția de denumire este `php74-php-fpm.service`.
Repornirea PHP-FPM afectează conexiunile active la baza de date sau sesiunile utilizatorilor?
O repornire dură (`systemctl restart`) termină imediat toate procesele worker, ceea ce închide orice conexiuni persistente la baza de date deținute de acei workeri. Sesiunile utilizatorilor stocate în fișiere sau o bază de date nu sunt afectate deoarece persistă independent de workerii PHP-FPM. O reîncărcare gracioasă (`systemctl reload`) permite workerilor să finalizeze cererile curente, astfel conexiunile persistente sunt închise curat.
De ce PHP-FPM nu reușește să pornească după o repornire?
Cele mai comune cauze sunt o eroare de sintaxă în `php.ini` sau un fișier de configurare a pool-ului, un conflict de port sau cale socket (un alt proces ascultă deja pe adresa `listen` configurată) sau permisiuni insuficiente pe directorul socket-ului. Rulează `php-fpm<ver> -t` pentru a valida sintaxa configurației și verifică `journalctl -u php<ver>-fpm` pentru mesajul exact de eroare.
Pot reporni PHP-FPM fără privilegii root sau sudo?
Nu pe o instalare Linux standard. Procesul master PHP-FPM rulează ca root (renunță la privilegii la `user`/`group` configurat pentru procesele worker) și gestionarea serviciilor de sistem necesită privilegii ridicate. Pe mediile de hosting partajat, furnizorul de hosting gestionează repornirile PHP-FPM prin panoul lor de control. Pentru control complet asupra PHP-FPM, un plan de VPS Hosting cu acces root este soluția adecvată.
