Согласно с этот отчет об ошибке на самом деле это не ошибка, а функция PHP7+ под Управление памятью Zend Engine:
[email protected] : это ожидаемое поведение. По запросу выключение Zend
диспетчер памяти не освобождает все выделенные фрагменты, а сохраняет
some[1], чтобы избежать необходимости их перераспределения, возможно, для следующего
запрос.
Предлагаемое решение состоит в том, чтобы позвонить: gc_mem_caches(). Ты можешь использовать auto_prepend_file
и auto_append_file
директивы в php.ini
выполнять его всегда, если это необходимо.
Однако это решение не помогло в моей ситуации, поэтому это не гарантия того, что оно сработает.
Поскольку в настоящий момент нет простого способа изменить это поведение, я нашел другой способ решить проблему с памятью (он должен работать для PHP7, PHP8):
- Вместо того, чтобы использовать
php-cgi
, использовать php-fpm
- Настройте конфигурацию FPM, чтобы использовать наименьшее количество дочерних процессов, но при необходимости позвольте ему создавать дочерние процессы, для этого вы можете либо использовать
по требованию
режим или динамичный
:
/etc/php7/php-fpm.d/www.conf
:
вечера = по требованию
; Отрегулируйте по мере необходимости:
pm.max_children = 10
или же:
вечера = динамический
; Отрегулируйте по мере необходимости:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
Основное различие между ними в том, что по требованию
будет использовать меньше памяти в режиме ожидания, но будет медленнее при подключении клиента.
Это сравнение моих результатов:
PHP |
Режим |
Дети |
Максимум |
Простой мем. |
Макс Мем. |
Время загрузки |
Максимальное время* |
PHP5 |
компьютерная графика |
4 |
4 |
50 МБ |
200 МБ |
5 с |
15 с |
PHP7 |
компьютерная графика |
4 |
4 |
200 МБ |
200 МБ |
5 с |
30-е годы |
PHP7 |
FPM / по запросу |
0 |
10 |
15 МБ |
500 МБ |
7 с |
10 с |
PHP7 |
FPM / динамический |
1 |
10 |
25 МБ |
500 МБ |
6 с |
10 с |
- Максимальное время загрузки протестировано при одновременном запуске 50 клиентов.
Значения в таблице являются приблизительными и предназначены только для иллюстрации (ни в коем случае не являются реальным эталоном).