Conform acest raport de eroare nu este cu adevărat un bug, ci o caracteristică în PHP7+ sub Gestionarea memoriei motorului Zend:
[email protected] : Acesta este comportamentul așteptat. La cerere, închiderea Zend
Managerul de memorie nu eliberează toate bucățile alocate, ci mai degrabă le păstrează
unele[1] pentru a evita necesitatea realocării lor eventual pentru următoarea
cerere.
Soluția sugerată este să sunați la: gc_mem_caches(). Poți să folosești auto_prepend_file
și auto_append_file
directive în php.ini
să-l execute întotdeauna dacă este necesar.
Cu toate acestea, acea soluție nu a ajutat în situația mea, așa că nu este o garanție că va funcționa.
Deoarece nu există o modalitate ușoară de a schimba acest comportament în acest moment, am găsit o altă modalitate de a rezolva problema memoriei (ar trebui să funcționeze pentru PHP7,PHP8):
- În loc de a folosi
php-cgi
, utilizare php-fpm
- Configurați configurația FPM pentru a utiliza cel mai mic număr de procese copii, dar lăsați-l să creeze copii dacă este necesar, pentru aceasta, puteți fie să utilizați
la cerere
modul sau dinamic
:
/etc/php7/php-fpm.d/www.conf
:
pm = la cerere
; Ajustați după cum este necesar:
pm.max_children = 10
sau:
pm = dinamic
; Ajustați după cum este necesar:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
Principala diferență dintre ele este că la cerere
va folosi mai puțină memorie când este inactiv, dar va fi mai lent când un client se conectează.
Aceasta este o comparație a rezultatelor mele:
PHP |
Modul |
Copii |
Max |
Inactiv Mem. |
Max Mem. |
Timp de încărcare |
Timp maxim* |
PHP5 |
CGI |
4 |
4 |
50 MB |
200 MB |
5s |
15s |
PHP7 |
CGI |
4 |
4 |
200 MB |
200 MB |
5s |
30 de ani |
PHP7 |
FPM / la cerere |
0 |
10 |
15 MB |
500 MB |
7s |
10s |
PHP7 |
FPM / dinamic |
1 |
10 |
25 MB |
500 MB |
6s |
10s |
- Timpul maxim de încărcare este testat rulând 50 de clienți simultan
Valorile din tabel sunt aproximative și doar în scop ilustrativ (nu sunt în niciun fel un punct de referință real).