Dựa theo báo cáo lỗi này nó không thực sự là một lỗi, mà là một tính năng trong PHP7+ dưới Quản lý bộ nhớ Zend Engine:
[email protected] : Đây là hành vi dự kiến. Khi tắt máy theo yêu cầu, Zend
trình quản lý bộ nhớ không giải phóng tất cả các khối được phân bổ, mà giữ lại
some[1] để tránh phải phân bổ lại chúng có thể cho lần tiếp theo
yêu cầu.
Giải pháp được đề xuất là gọi: gc_mem_caches(). Bạn có thể dùng auto_prepend_file
và auto_append_file
chỉ thị trong php.ini
để thực thi nó luôn nếu cần.
Tuy nhiên, giải pháp đó không giúp được gì trong tình huống của tôi, vì vậy không có gì đảm bảo rằng nó sẽ hoạt động.
Vì không có cách nào dễ dàng để thay đổi hành vi đó vào thời điểm hiện tại, tôi đã tìm ra một cách khác để giải quyết vấn đề về bộ nhớ (cách này sẽ hoạt động với PHP7, PHP8):
- Thay vì sử dụng
php-cgi
, sử dụng php-fpm
- Thiết lập cấu hình FPM để sử dụng ít tiến trình con nhất, nhưng hãy để nó tạo con nếu cần, đối với điều này, bạn có thể sử dụng
theo yêu cầu
chế độ hoặc năng động
:
/etc/php7/php-fpm.d/www.conf
:
chiều = theo yêu cầu
; Điều chỉnh khi cần thiết:
pm.max_children = 10
hoặc:
chiều = động
; Điều chỉnh khi cần thiết:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
Sự khác biệt chính giữa chúng là theo yêu cầu
sẽ sử dụng ít bộ nhớ hơn khi không hoạt động nhưng sẽ chậm hơn khi máy khách kết nối.
Đây là một so sánh các kết quả của tôi:
PHP |
Cách thức |
Bọn trẻ |
tối đa |
Mem Nhàn. |
Max Mem. |
Thời gian tải |
Thời gian tối đa* |
PHP5 |
CGI |
4 |
4 |
50MB |
200MB |
5s |
15s |
PHP7 |
CGI |
4 |
4 |
200 MB |
200MB |
5s |
tuổi 30 |
PHP7 |
FPM / theo yêu cầu |
0 |
10 |
15 MB |
500MB |
7s |
10 giây |
PHP7 |
FPM / năng động |
1 |
10 |
25 MB |
500MB |
6s |
10 giây |
- Thời gian tải tối đa được kiểm tra khi chạy đồng thời 50 máy khách
Các giá trị trong bảng là gần đúng và chỉ nhằm mục đích minh họa (không phải là điểm chuẩn thực dưới bất kỳ hình thức nào).