@paskelas

Сколько памяти расходует скрипт PHP?

Всем добра.
Имеется простой скрипт, который берет два xml файла и сравнивает их между собой. Точнее сказать, в начале скрипта содержимое файлов импортируется посредством simplexml_load_file, конвертируется в обычный массив, а с двумя массивами и производятся дальнейшие манипуляции.
Получив в один прекрасный момент фатальную ошибку про нехватку памяти, начал изучать проблему и ясности пока нет.
Если (вдруг) имеет значение запускается все на простом конфиге с 4гб оперативной памяти и таким же по объему файлом подкачки, linux mint, apache, php 7.4
Расставил memory_get_usage(true) несколько раз в скрипте, надеясь найти "прожорливую" функцию, зависимости не обнаружил.
Самое для меня непонятное, что пиковое потребление (memory_get_peak_usage(true) поставил в конце скрипта) может выдать 210 МБ (это случилось после запуска скрипта после перезагрузки ОС) После каждого последующего обновления страницы наблюдается странная картина:
1. вариант : скрипт может упасть с не хваткой памяти (в php.ini специально выставил 128Мб после того, как увидел что скрипт может съесть 210МБ),
2. вариант : может выполниться , но при этом показывает постоянно различные мегабайты потребления оперативной памяти.
Код, разумеется не меняется, обновляется страница в бразузере.
Наблюдается некая закономерность. Если подряд выполнять несколько раз, то сначала обычно - фатальная ошибка с нехваткой памяти, потом потребление падает при каждом выполнении, вплоть до 26мб. в пике и 2 мб в теле скрипта.
В скрипте расставлены unset() где это возможно, для очистки памяти.
С чем это связано? Что почитать на эту тему?
  • Вопрос задан
  • 458 просмотров
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
потом потребление падает при каждом выполнении

Это скорее всего OPcache, который
улучшает производительность PHP путём сохранения скомпилированного байт-кода скриптов в разделяемой памяти, тем самым избавляя PHP от необходимости загружать и анализировать скрипты при каждом запросе.

Это расширение доступно по умолчанию с PHP 5.5.0

Отключив OPcache вы скорее всего получите стабильный, максимально хреновый результат.
Ответ написан
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Попробуйте упростить работу РНР, сделайте преобразование XML в иерархический массив.
Накладные расходы на хранение будут в разы меньше.
Еще меньше если не будете использовать иерархию, а сформируете хеш-массив всех элементов.
xml-структура в путь, далее в хеш
a->b->c = hash(abc) = 01f
$a['01f'] = $value

Реализовать класс для работы с таким массивом, что бы можно было обращаться по "пути xml".
Может показаться излишеством, но памяти будет есть меньше чем работа с simpleXml или DOM - у них много накладных расходов
Ответ написан
@paskelas Автор вопроса
Вопрос решен.
spoiler


Для того чтобы привести xml к нужному мне виду (ассоциативный массив) я использовал последовательно связку встроенных функций из simplexml_load_file, json_encode json_decode (true), и проблема была именно в них.
Замер (приблизительный) переменной, полученной после simplexml_load_file дал вполне себе вменяемый расход
памяти. Соответственно, проблема была с функциями которые работают с JSON. Сразу же вспомнил, что скрипт всегда падал на json_decode (true), но в тот момент думал, что она последняя в очереди на обработку и ей просто не хватает выделанной памяти.
Далее. Ни unset () ни присваивание null переменным которые получались в ходе работы функций не оказали значимого эффекта.
Проблема устранена после того как исключил json_encode json_decode (true) из кода (получаю массив из xml иным способом, остальной код тот же, файлы те же).
Потребление памяти стабильно и в разумных пределах, скрипт не падает, выполняется за 2-3 секунды (не указал это ранее. но время выполнение скрипта тоже варьировалось от нескольких секунд до минуты.)

Ответ написан
Комментировать
Ваш ответ на вопрос

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

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