Есть некий скрипт на 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() не освобождает память.
Можно для обработки Экселя создавать форк, ждать его завершения...но мне кажется это не слишком корректным способом.
Сам искал. Нет, кроме Spoutbox. Но мне пришлось его допиливать под себя ибо там функционал куцый. Но зато позволяет работать хоть с гигабайтным эксель-файлом, не съев оперативку.