Стратегии для обработки потребления памяти в PHP5? - PullRequest
6 голосов
/ 24 октября 2008

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

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

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

В конце вопрос: какие стратегии вы применяете, когда вам нужно, чтобы ваши сценарии были на диете?

Ответы [ 5 ]

6 голосов
/ 24 октября 2008

Когда мне нужно оптимизировать ресурсы для любого скрипта, я стараюсь всегда анализировать, профилировать и отлаживать свой код, я использую xDebug и xDebug Profiler , есть другие варианты как APD и Benchmark Profiler .

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

6 голосов
/ 24 октября 2008

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

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

0 голосов
/ 11 ноября 2008

Концерт!?!

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

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

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

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

0 голосов
/ 24 октября 2008

Бертран,

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

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

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

Однако, прежде чем вы приступите к серьезному рефакторингу, убедитесь, что ваша среда достаточно похожа, посмотрев на phpinfo (); для PHP и SHOW VARIABLES; в MySQL?

0 голосов
/ 24 октября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...