Есть ли недостатки в производительности при использовании автозагрузки классов в PHP? - PullRequest
10 голосов
/ 23 ноября 2011

В настоящее время я загружаю все свои классы, включая файл «all.inc.php» на каждой странице моего сайта, затем этот файл включает все настройки, классы, функции и т. Д., Которые я буду использовать на весь сайт.

Моя проблема с этим заключается в том, что я часто использую классы, которые относятся только к определенным страницам / разделам веб-сайта, поэтому часто в начале страницы я включаю несколько классов, которые не будут использоваться.

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

Ответы [ 5 ]

10 голосов
/ 23 ноября 2011

Эта статья содержит некоторую информацию и тесты: Производительность автозагрузки PHP . Вывод:

Автозагрузка существенно не снижает производительность. Поиск include_path, чтение и синтаксический анализ PHP-сценариев с диска занимает гораздо больше времени, чем эта логика автоматической загрузки.

6 голосов
/ 23 ноября 2011

Автозагрузка класса выполняется почти так же быстро, как и включение класса обычным способом. Переключение на автозагрузку повысит производительность в вашем случае, потому что PHP загружает меньше файлов и классов.

3 голосов
/ 23 ноября 2011

Автозагрузка улучшит производительность, если сценарию не придется каждый раз искать файлы в файловой системе. Если вы используете пространства имен, вы можете получить хорошее сопоставление пространства имен и имени класса с папкой, а файл, такой как Some / Nice / ClassName, будет отображаться в Some / Nice / ClassName.php.

Если вы не используете пространства имен и вам приходится искать в папках, я предлагаю вам создать собственный одноэлементный класс, включающий файлы, которые позволяют вам делать что-то вроде:

Приложение :: использует ('Some / Nice', 'ClassName');

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

2 голосов
/ 23 ноября 2011

Вы должны использовать автозагрузку с индексом кэша всех доступных классов / файлов в проекте.

Пример:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php',
    'Item'=>'model/Item.php'
);

function __autoload($class_name) {
 if(array_key_exists($class_name))
   include $class_cache[$class_name];
 else
   throw new Exception("Unable to load $class_name.");
}

Вам необходимо сохранить список классов актуальным или написать генератор для $ class_cache.

1 голос
/ 23 ноября 2011

Каждый include() и require() (и их _once братья и сестры) несут штраф за производительность самостоятельно.Поиск и чтение диска также осуществляются за дополнительную плату.Это действительно зависит от вашего кода: если вы загружаете 20 классов, но используете только 2 или 3 в любой отдельной точке, то определенно стоит пойти по пути автозагрузки.

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

...