Задать вопрос
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() не освобождает память.

Можно для обработки Экселя создавать форк, ждать его завершения...но мне кажется это не слишком корректным способом.
  • Вопрос задан
  • 504 просмотра
Подписаться 3 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Akuma
@Akuma Автор вопроса
Веб-программист
Твою ж налево. Оказывается есть gc_mem_caches() которая успешно справляется с задачей вычищая все лишнее.

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽