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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
1 774
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

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

Бертран,

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

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

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

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

Ответ принят как подходящий

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

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

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

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

Концерт!?!

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

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

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

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

Объекты в PHP5 передаются по ссылке автоматически.

grantwparks 27.07.2009 08:26

В самом деле?! разве это не разрушило бы идею размаха? если вы передаете объект функции, эта функция работает с копией объекта, а не с фактическим объектом. (если вы не передадите объект по ссылке.)

Bingy 07.05.2010 08:35

То, что сказал @grantwparks, является большим упрощением ... php.net/manual/en/language.oop5.references.phpOne of the key-points of PHP 5 OOP that is often mentioned is that "objects are passed by references by default". This is not completely true. This section rectifies that general thought using some examples.

MrMesees 27.01.2015 19:52

Он не работает с копией объекта; если вы вносите изменения в объект, переданный функции, объект изменяется. Создается и передается новая «ссылка / дескриптор / идентификатор» (следовательно, объект вообще не передается). Память, используемая этой ссылкой должен, не зависит от размера объекта. То, что @ user1548557 называет грубым упрощением, я называю практическим эффектом для всех намерений и целей, когда дело доходит до адресации памяти. То, что на странице php.net много путаницы, не означает, что это сложно.

grantwparks 01.02.2015 06:26

Если вы явно не передадите ссылку, поведение, которое вы предлагаете, будет происходить только при определенных обстоятельствах и не будет сохранять более глубокую структуру объекта, это не подлежит обсуждению, документы PHP.net согласны со мной, вы даже описываете процесс, признавая, что объект не передано по ссылке, пожалуйста, просмотрите CS101

MrMesees 02.02.2015 05:26

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