Оптимизация PHP require_once для низкого дискового ввода-вывода? - PullRequest
2 голосов
/ 31 марта 2010

Q1) Я занимаюсь разработкой CMS (но это не так!), Но приоритет отдается кешированию. Буквально все кешируется. Строки БД, запросы идентификаторов БД, данные конфигурации, обработанные данные, скомпилированные шаблоны. В настоящее время он имеет два уровня кэширования.

Первый - это кэш кода операции или кэш памяти, такой как apc, eaccelerator, xcache или memcached. Если запись там не найдена, она ищется во вторичном медленном кеше, т.е. включает в себя php.

Действительно ли кэши кода операции действительно быстрее, чем делать require_once для php-файла с массивом данных var_export? Мои тесты не дают результатов, так как мой блок разработки (5.3 из XAMPP) продолжает выдавать ошибки при установке любой из вышеупомянутых программ.

Q2) CMS имеет множество вспомогательных классов, которые автоматически загружаются по требованию вместо загрузки всех файлов. В большинстве случаев перед каждым есть требование, поэтому не нужно выполнять автозагрузку, однако это не вопрос. Поскольку в сценарий страницы может быть включено до 50/60 вспомогательных файлов, у меня есть ощущение, что если бы сайт находился под давлением, он бы прогибался из-за всех операций ввода-вывода, которые это вызывает. На данный момент не обращайте внимания на наличие кэша вывода, который устранял бы необходимость в том, что я собираюсь предложить, а также на то, что кэши кодов операций будут воспроизводить этот спор. Я попытался объединить все вспомогательные файлы, необходимые для выполнения сценариев, в один файл. Это достижимо и работает хорошо, однако побочным эффектом является значительное увеличение использования памяти, хотя технически используется тот же код.

Что вы думаете об этом?

Ответы [ 4 ]

1 голос
/ 18 февраля 2012

Похоже, вы просто не представляете, что вы хотите кэшировать (и почему).

Вы просто не можете сравнить «кэш кода операции» и «require_once». Кэш кода операции будет кэшировать необходимый код, а также другой код.

1 голос
/ 31 марта 2010

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

0 голосов
/ 18 февраля 2012

Я согласен с Ryeguy. require_once медленнее, чем require или include, потому что он должен регистрировать каждое включение и проверять его. Если вы выполняете только одно требование / включение (которым вы должны быть для классов), тогда вам не нужны require_once или include_once.

Автозагрузка отлично подходит для оптимизации. Как вы только загрузите в классах, когда это необходимо. Так что если ваше приложение имеет 500 классов, но для запуска определенной страницы / скрипта нужно всего 15. Тогда только те 15 загружаются. Что приятно.

Если вы берете пик на любом большом каркасе. Вы заметите, что они перешли на использование автозагрузчиков. Они используют для использования require_once в последний момент, как этот пример из Zend Framework версии 1.

require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception('Adapter name must be specified in a string');

В Zend Framework версии 2 вместо этого будут использоваться автозагрузчики. Я считаю, что это самый быстрый и самый простой для кода код.

0 голосов
/ 31 марта 2010

Во-первых, помните, что ваша операционная система будет кэшировать файлы в памяти, если к ним обращаются достаточно часто.

Кроме того, не используйте require_once. Это значительно медленнее, чем require. Если вы не используете автозагрузчик, вы должны быть. Нет смысла вручную включать файлы в современное php-приложение (очень мало исключений).

50-60 вспомогательных файлов - это безумие. Разве нет способа объединить их? Разве вы не можете поместить их всех в связанный вспомогательный класс, например OutputHelper или CacheHelper? Таким образом, вам нужно только включить класс, который, опять же, должен позаботиться о вашем автозагрузчике. Мне кажется, вы делаете что-то вроде одной функции на файл.

Кэширование кода операции значительно уменьшает использование памяти и скорость выполнения, но я не уверен, как это повлияет на операторы require.

...