Лучшая производительность для загрузки настроек в PHP? - PullRequest
1 голос
/ 26 января 2010

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

<?php
/**
 * @Filename app-config.php
 * @description Array to return to our config class
 */
return array(
    'db_host' => 'localhost',
    'db_name' => 'socialnetwork',
    'db_user' => 'root',
    'db_password' => '',
    'site_path' => 'C:/webserver/htdocs/project/',
    'site_url' => 'http://localhost/project/',
    'image_path' => 'C:/webserver/htdocs/fproject/images/',
    'image_url' => 'http://localhost/project/images/',
    'site_name' => 'test site',
    'admin_id' => 1,
    'UTC_TIME' => gmdate('U', time()),
    'ip' => $_SERVER['REMOTE_ADDR'],
             'testtttt' => array(
                     'testtttt' => false
                     )
);
?>

Обратите внимание, что фактический массив конфигурации НАМНОГО БОЛЬШЕ, в нем гораздо больше элементов ...
Тогда у меня будет файл Config.class.php, который будет загружать мой массив и использовать магический метод __get ($ key).После этого я могу автоматически загрузить файл своего класса конфигурации и получить доступ к любым настройкам сайта, подобным этому ...

$config->ip;
$config->db_host;
$config->db_name;
$config->db_user;

Так что я понимаю, что это прекрасно работает и очень гибко, в моем классе я могу прочитать его в файле PHPс массивом, как я делаю сейчас, читать INI-файл в массив, читать XML-файл в массив, читать JSON-файл в массив.Так что он очень гибкий для будущих проектов, но меня больше беспокоит производительность для этого конкретного проекта, над которым я сейчас работаю, это будет сайт социальной сети, такой как facebook / myspace, и у меня был один до этого проекта, и как только яполучил около 100 000 пользователей производительность стала очень важной.Так что я не «микрооптимизирую» или «преждевременно оптимизирую». Я очень стараюсь сделать это ЛУЧШИМ способом с точки зрения производительности, он не должен быть гибким, поскольку он мне понадобится только в этом проекте.

Таким образом, с этой информацией я всегда читаю о людях, пытающихся как можно больше исключать вызовы функций, говоря, что вызовы функций вызывают дополнительные издержки .Так что я хочу узнать от более опытных людей, что вы думаете об этом?Я новичок в использовании классов и объектов в PHP, поэтому вызывает $ config-> db_user;столь же дорогой, как и вызов функции в процедурном порядке, как этот getOption ('db_user');?Я предполагаю, что это то же самое, что каждый раз, когда я вызываю параметр, он использует метод __get ().

Так что для лучшей производительности я должен пойти по-другому?Например, просто загрузить мой конфигурационный массив в файл начальной загрузки и получить доступ к элементам, когда они мне нужны, например так ...

$config['db_host'];
$config['db_username'];
$config['db_password'];
$config['ip'];

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

Ответы [ 3 ]

4 голосов
/ 26 января 2010

Из тестов, которые я видел, я считаю, что ответ Аликс Аксель, приведенный выше, является правильным относительно относительной скорости четырех методов. Использование прямых методов является самым быстрым, а использование любого магического метода обычно медленнее.

Также с точки зрения оптимизации. Самым большим ударом по производительности для любого отдельного запроса в описываемой вами системе, вероятно, будет синтаксический анализ XML / INI / JSON, а не доступ к нему через какой-либо синтаксис, который вы решите использовать. Если вы хотите это исправить, сохраните загруженные данные в APC после их анализа. Это будет сопровождаться одним предупреждением о том, что вы захотите хранить в нем только статические данные, а не такие динамические вещи, как дата UTC.

3 голосов
/ 26 января 2010

Во-первых, вместо включенного файла, который возвращает массив, я бы вместо этого использовал файл .ini, а затем использовал PHP parse_ini_file() для загрузки настроек.

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

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

Так что выбирайте наиболее естественную реализацию. Либо объект, либо массив будут работать одинаково хорошо. На самом деле объект имеет преимущество в том, что вы можете сделать:

$db = $config->database->hostname;

, где $config->database может неявно загрузить только раздел базы данных INI-файла и создаст другой объект конфигурации, который может вернуть запись hostname. Если вы хотите сегментировать ваш конфигурационный файл таким образом.

1 голос
/ 26 января 2010

IMO это самые быстрые методы (по порядку):

  1. $config['db_user']
  2. $config->db_user напрямую
  3. $config->db_user через __get()
  4. getOption('db_user') через __get()

Кроме того, вы уже задали много вопросов о вашей конфигурации системы , я не против, но я специально вспомнил, что вы задали вопрос о том, следует ли вам использовать parse_ini_file() или не .

Почему вы повторяете одни и те же вопросы снова и снова?

Я думаю, что вы выводите преждевременную оптимизацию на совершенно новый уровень, вам следует беспокоиться о производительности 100 000 пользователей тогда и когда вы получите 50 000 пользователей или около того, не сейчас .

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