Стратегии управления потреблением памяти в PHP5?

StackOverflow https://stackoverflow.com/questions/231707

  •  04-07-2019
  •  | 
  •  

Вопрос

У нас есть большое программное обеспечение для управления, которое создает большие отчеты всех видов на основе многочисленных циклов с поиском данных из базы данных, созданием объектов (многих) и так далее.

На PHP4 он мог успешно работать с ограничением памяти в 64 МБ - теперь мы переместили его на новый сервер и с той же базой данных - тот же код, те же отчеты не появятся без ограничения памяти...

Я знаю, что PHP5 многое изменил под капотом, но есть ли способ заставить его работать?

В конце возникает вопрос: какие стратегии вы применяете, когда вам нужно посадить свои сценарии на диету?

Это было полезно?

Решение

Большой проблемой, с которой мы столкнулись, были циклические ссылки между объектами, которые мешали им освобождать память, когда они выходили за рамки видимости.

В зависимости от вашей архитектуры вы можете использовать __destruct () и вручную сбросить любые ссылки. В нашей задаче я реструктурировал классы и удалил циклические ссылки.

Другие советы

Когда мне нужно оптимизировать ресурсы какого-либо скрипта, я всегда стараюсь анализировать, профилировать и отлаживать свой код, использую xDebug, и Профилировщик xDebug, есть и другие варианты, например АПД, и Профилировщик тестов производительности.

Дополнительно рекомендую вам следующие статьи:

После перехода на новый сервер вы убедились, что ваши системные переменные MySQL и PHP идентичны тем, которые были на вашем старом сервере?

PHP5 представил много новых функций, но из-за его мантры обратной совместимости, я не верю, что различия между PHP5 и PHP4 должны оказывать такое большое влияние на производительность приложения, чей код и база данных не были изменено.

Вы также используете ту же версию Apache или IIS?

Это похоже на проблему, которая скорее связана с вашей новой системной средой, чем с обновлением с PHP4 до 5.

Бертран,

Если вы заинтересованы в рефакторинге существующего кода, я бы рекомендовал вам сначала отслеживать использование ЦП и памяти при выполнении отчетов.Вы блокируете свой SQL-сервер или Apache (что происходит, если код PHP оказывает на систему большую нагрузку)?

Я работал над проектом, который поначалу настолько сильно тормозил MySQL, что нам пришлось реорганизовать весь процесс генерации отчетов.Однако когда мы закончили, нагрузка просто перешла на Apache (через более сложный PHP-код).Наше окончательное решение состояло в том, чтобы реорганизовать структуру базы данных, чтобы обеспечить лучшую производительность функций отчетности, и использовать PHP, чтобы компенсировать то, что мы не могли сделать в MySQL изначально.

В зависимости от характера отчетов вы можете рассмотреть возможность денормализации данных, используемых в отчетах.Вы можете даже рассмотреть возможность создания второй базы данных, которая будет служить хранилищем данных и будет разработана на основе принципов OLAP, а не принципов OLTP.Вы можете начать с Википедии, чтобы получить общее объяснение OLAP и хранилищ данных.

Однако, прежде чем приступить к серьезному рефакторингу, убедитесь ли вы, что ваши среды достаточно похожи, просмотрев phpinfo();для PHP и ПОКАЗАТЬ ПЕРЕМЕННЫЕ;в MySQL?

Концерт!?!

даже 64 МБ это большой.

игнорируя несоответствие между средами (что звучит очень странно), похоже, что код может нуждаться в некотором перефакторинге.

есть шанс, что вы сможете изменить свой код, чтобы результирующие наборы из запросов к базе данных не помещались в массивы. Я бы порекомендовал вам создать итератор для ваших наборов результатов. (поэтому вы можете рассматривать их как массив для большинства целей). Существует большая разница между обработкой одной записи за раз и обработкой 10 000 записей за раз.

во-вторых, взгляните на погоду, когда ваш код создает несколько экземпляров данных. Можете ли вы передать объекты по ссылке. (используйте '& amp;'). Мы должны были сделать то же самое при использовании раннего варианта структуры орды. вложение в 1 МБ вылилось бы в 50 МБ из-за многочисленных вызовов, которые передавали весь набор данных как копию, а не как ссылку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top