Akuma
@Akuma
Веб-программист

Как освободить «real memory usage» в PHP?

Здравствуйте,

Есть некий скрипт на PHP 7.1, который работает в фоне и может запускаться несколько копий одновременно.
Этот скрипт использует PHPExcel для обработки файлов и в связи с этим жрет около 200-300 Мб на "сессию".

Схема работы примерно следующая (memory_get_usage(false) / memory_get_usage(true)):
- Загрузили Excel (200 Мб / 200 Мб)
- Собрали данные (200 Мб / 200 Мб)
- Выгрузили Excel из памяти (9 Мб / 200 Мб)
- Выполняем дополнительную, длительную работу над данными (9 Мб / 200 Мб)

В последнем "этапе". Скрипт выгрузил из памяти Excel и собрал мусор с gc_collect_cycles().
memory_get_usage(false) - 9 Мб
memory_get_usage(true) - 200 Мб

Сбор данных из Экселя выполняется секунд 10 максимум, а вот дальнейшие операции могут занимать минут 20.

Если запустить штук 10 таких скриптов одновременно, память переполняется, хотя по факту каждому скрипту нужно только 9 Мб, а 191 просто простаивает как занятые пока скрипт не отработает и процесс не будет завершен.

Соответственно, 190 Мб от каждого процесса можно отдать системе под другие нужны.
Но как это сделать?

gc_collect_cycles() не освобождает память.

Можно для обработки Экселя создавать форк, ждать его завершения...но мне кажется это не слишком корректным способом.
  • Вопрос задан
  • 491 просмотр
Решения вопроса 1
Akuma
@Akuma Автор вопроса
Веб-программист
Твою ж налево. Оказывается есть gc_mem_caches() которая успешно справляется с задачей вычищая все лишнее.

Учитывая, что про нее вообщен игде не сказано, кроме официальных доков, думаю я не один про нее не знал. Вопрос оставлю, вдруг кому поможет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы