Стоит ли использовать require_once () для экономии памяти? - PullRequest
4 голосов
/ 23 августа 2010

Я хотел бы проверить правильность моего понимания относительно require_once(). У меня есть куча функций в файле foo.php. Скажем, 7/8 из них всегда используются, и один из них довольно редкий и довольно большой. Я должен сохранить определение этой функции в foo.php. Можете ли вы сказать мне, достигает ли следующий подход чего-либо, и считаете ли вы, что оно того стоит?

  • Вынуть тело функции и поместить его во внешний файл.
  • Переопределить исходную функцию для require_once() этого конкретного файла и передать выполнение вспомогательной функции.

Я понимаю, что это может сэкономить память сервера для запросов, где эта функция не выполняется. Что именно я экономлю, хотя? Просто память, необходимая для хранения тела функции? Это означало бы, что это должно быть довольно большая функция, прежде чем она того стоит. Кроме того, если я использую что-то вроде APC, это станет менее полезным?

Пожалуйста, исправьте или добавьте к этому, если необходимо!

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Я очень сомневаюсь, что вы выиграете от рефакторинга в отдельный файл.Кроме того, у вас действительно есть какие-либо проблемы с кодом, как сейчас, что заставляет вас задуматься об этом?Вы знаете, преждевременная оптимизация - корень всего зла.Профилируйте свой код, чтобы увидеть, есть ли в нем узкие места, и только потом тратить время на бессмысленную микрооптимизацию.

1 голос
/ 23 августа 2010

Обновление: Из вашего комментария к Гордону я вижу, что вы используете Drupal: этот метод там не работает, потому что Drupal уже сильно объектно-ориентирован.Здесь описано использование механизма автозагрузки для основанного на функциях проекта с использованием статических классов.

Как говорит Гордон, это сэкономит память только для действительно невероятно огромных функций.Однако, по моему опыту, загрузка включений в память занимает гораздо больше места, чем точное количество байтов, необходимое для хранения кода.Я не эксперт по внутренним PHP, но я предполагаю, что код анализируется или, по крайней мере, предварительно обрабатывается в любом случае.

Предполагая, что ваше PHP-приложение полностью основано на функциях без ООП, вам приходит в голову одна идея, которую вы можете использовать для разделения ваших включений, - это поместить свои функции в классы и использовать механизм автозагрузчика:

class maintenance_functions
 { 

   public static function xyz() { ................  }

и начните вызывать их статически:

 maintenance_functions::xyz();

один класс будет занимать один файл.

Группировать все редко используемые функции в отдельные файлы.

Тогда вы можете использовать механизм Autoloading .Это автоматически загрузит необходимые классы в тот момент, когда они нужны.Если я, например, позвоню

 datamining_functions::xyz();

, автозагрузчик найдет файл, содержащий datamining_functions, и включит его.Это устраняет все хлопоты 'require ()' и позволяет вам сконцентрироваться на том, как наиболее эффективно сгруппировать ваши функции.

Это не настоящий переход к ООП: мы просто используем конструкции классов для группировки функций, чтобычтобы иметь возможность использовать автозагрузчик.Должна быть предусмотрена возможность переноса функций в такие классы без необходимости серьезных переписываний.

0 голосов
/ 23 августа 2010

Вы должны использовать Xdebug , чтобы узнать ответ - ценность или нет субъективна.

...