Создание конфигурационного файла в PHP
Я хочу создать конфигурационный файл для моего проекта PHP, но я не уверен, что лучший способ сделать это.
у меня есть 2 идеи до сих пор.
1-Использовать Переменную
$config['hostname'] = "localhost";
$config['dbuser'] = "dbuser";
$config['dbpassword'] = "dbpassword";
$config['dbname'] = "dbname";
$config['sitetitle'] = "sitetitle";
2-Используйте Const
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('TITLE', 'sitetitle');
3-Использовать Базу Данных
Я буду использовать конфигурацию в классах, поэтому я не уверен, какой способ будет лучшим или если есть лучший способ.
10 ответов:
один простой, но элегантный способ создать
config.phpфайл (или как вы его называете), который просто возвращает массив:<?php return array( 'host' => 'localhost', 'username' => 'root', );и затем:
$configs = include('config.php');
использование INI-файла-это гибкое и мощное решение! В PHP собственной функции чтобы справиться с этим должным образом. Например, можно создать INI-файл следующим образом:
[database] db_name = mydatabase db_user = myuser db_password = mypassword [application] app_email = [email protected] app_url = myapp.comтак что единственное, что вам нужно сделать, это позвонить:
$ini = parse_ini_file('app.ini');тогда вы можете легко получить доступ к определениям с помощью
$iniмассив.echo $ini['db_name']; // mydatabase echo $ini['db_user']; // myuser echo $ini['db_password']; // mypassword echo $ini['app_email']; // [email protected]важно: по соображениям безопасности INI-файл должен находиться в непубличной папке
Я использую небольшую эволюцию @hugo_leonardo ' s решение:
<?php return (object) array( 'host' => 'localhost', 'username' => 'root', 'pass' => 'password', 'database' => 'db' ); ?>это позволяет использовать синтаксис объекта при включении php:
$configs->hostвместо$configs['host'].кроме того, если ваше приложение имеет конфигурации, которые вам нужны на стороне клиента (например, для углового приложения), вы можете иметь это
config.phpфайл содержит все ваши конфигурации (централизованные в одном файле вместо одного для JavaScript и одного для PHP). Тогда трюк будет иметь другой PHP-файл что быechoтолько информация на стороне клиента (чтобы избежать отображения информации, которую вы не хотите показывать как строку подключения к базе данных). Назовите это сказатьget_app_info.php:<?php $configs = include('config.php'); echo json_encode($configs->app_info); ?>выше предполагая, что ваш
config.phpсодержит элемент :<?php return (object) array( 'host' => 'localhost', 'username' => 'root', 'pass' => 'password', 'database' => 'db', 'app_info' => array( 'appName'=>"App Name", 'appURL'=> "http://yourURL/#/" ) ); ?>таким образом, информация о вашей базе данных остается на стороне сервера, но информация о вашем приложении доступна из вашего JavaScript, например, с
$http.get('get_app_info.php').then(...);тип вызова.
Я довольно удивлен принятым здесь ответом и количеством голосов, которые он получил. За исключением ответа Марсио Маццукато, нет никакого обсуждения относительных достоинств / недостатков любого из многочисленных подходов.
варианты, которые я вижу:
механизмы на основе файлов
Они требуют, чтобы ваш код искал в определенных местах, чтобы найти файл ini. Это трудная проблема для решения и тот, который всегда появляется в больших PHP-приложениях. Однако вам, вероятно, придется решить эту проблему, чтобы найти PHP-код, который будет включен / повторно использован во время выполнения.
общие подходы к этому-всегда использовать относительные каталоги или искать из текущего каталога вверх, чтобы найти файл, исключительно названный в базовом каталоге приложения.
общие форматы файлов, используемые для конфигурационных файлов являются PHP код, ini форматированные файлы, JSON, XML, YAML и сериализованные PHP
PHP-кода
Это обеспечивает огромную гибкость для представления различных структур данных, и (предполагая, что он обрабатывается с помощью include или require) анализируемый код будет доступен из кэша кода операции - что дает преимущество в производительности.
The include_path предоставляет средство для абстрагирования потенциальных местоположений файла без использования дополнительного кода.
с другой стороны, одним из основная причина отделения конфигурации от кода заключается в разделении обязанностей. Он предоставляет маршрут для ввода дополнительного кода в среду выполнения.
если конфигурация создается из инструмента, возможно, можно проверить данные в инструменте, но нет стандартной функции для экранирования данных для встраивания в PHP-код, как существует для HTML, url, операторов MySQL, команд оболочки....
сериализованные данные Это относительно эффективно для малых объем конфигурации (до 200 элементов) и позволяет использовать любую структуру данных PHP. Для создания / анализа файла данных требуется очень мало кода (поэтому вы можете вместо этого потратить свои усилия на то, чтобы файл был написан только с соответствующим разрешением).
экранирование содержимого, записанного в файл, обрабатывается автоматически.
поскольку вы можете сериализовать объекты, он создает возможность для вызова кода просто путем чтения файла конфигурации (the __wakeup magic method).
структурированный файл
хранение его в виде INI-файла, как предложено Marcel или JSON или XML, также предоставляет простой api для отображения файла в структуру данных PHP (и, за исключением XML, для экранирования данных и создания файла), устраняя уязвимость вызова кода с помощью сериализованных данных PHP.
Он будет иметь аналогичные характеристики для сериализованных данных.
Ну - это было бы своего рода трудно хранить данные конфигурации базы данных в базе данных - не так ли?
но на самом деле, это довольно сильно самоуверенный вопрос, потому что любой стиль действительно работает, и все это вопрос предпочтения. Лично я бы выбрал переменную конфигурации, а не константы - обычно потому, что мне не нравятся вещи в глобальном пространстве, если это не необходимо. Ни одна из функций в моей кодовой базе не должна иметь возможности легко получить доступ к моей базе данных пароль (кроме моей логики подключения к базе данных) - поэтому я бы использовал его там, а затем, вероятно, уничтожил его.
Edit: чтобы ответить на ваш комментарий-ни один из механизмов разбора не будет самым быстрым (ini, json и т. д.), но они также не являются частями вашего приложения, которые вам действительно нужно сосредоточиться на оптимизации, поскольку разница в скорости будет незначительной для таких небольших файлов.
обычно я в конечном итоге создаю один conn.php-файл, который имеет моего подключения к базе данных. Затем я включаю этот файл во все файлы, которые требуют запросов к базе данных.
Define сделает константу доступной везде в вашем классе без необходимости использовать global, в то время как переменная требует global в классе, я бы использовал DEFINE. но опять же, если параметры БД должны изменяться во время выполнения программы, вы можете придерживаться переменной.
Если вы думаете, что будете использовать более 1 дБ по какой-либо причине, перейдите к переменной, потому что вы сможете изменить один параметр, чтобы переключиться на совершенно другую дБ. Т. е. для тестирования , автоматического резервного копирования и т. д.
вы можете создать класс конфигурации ведьма статические свойства
class Config { static $dbHost = 'localhost'; static $dbUsername = 'user'; static $dbPassword = 'pass'; }затем вы можете просто использовать это:
Config::$dbHost
иногда в моих проектах я использую шаблон дизайна синглтон для доступа к данным конфигурации. Это очень удобно в использовании.
почему?
например у вас есть 2 источника данных в проекте. И вы можете выбрать ведьму из них есть включен.
- mysql
- json
где-то в конфигурационном файле вы выбираете:
$dataSource = 'mysql' // or 'json'при изменении источника всего приложения shoud переключиться на новый источник данных, работать нормально и не нужно менять код.
пример:
Config:
class Config { // .... static $dataSource = 'mysql'; / ..... }Синглтон-класс:
class AppConfig { private static $instance; private $dataSource; private function __construct() { $this->init(); } private function init() { switch (Config::$dataSource) { case 'mysql': $this->dataSource = new StorageMysql(); break; case 'json': $this->dataSource = new StorageJson(); break; default: $this->dataSource = new StorageMysql(); } } public static function getInstance() { if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function getDataSource() { return $this->dataSource; } }... и где-то в коде (например. в каком-то классе обслуживания):
$container->getItemsLoader(AppConfig::getInstance()->getDataSource()) // getItemsLoader need Object of specific data source class by dependency injectionмы можем получить AppConfig объект из любого места в системе и всегда получает одну и ту же копию (благодаря статике). Вызывается метод init () класса В конструкторе, который гарантирует только одно выполнение. Init () проверка тела Значение config $dataSource, и создать новый объект определенного класса источника данных. Теперь наш скрипт может достать объект и оперировать на нем, не зная даже какая конкретная реализация на самом деле существует.
вот мой путь.
<?php define('DEBUG',0); define('PRODUCTION',1); #development_mode : DEBUG / PRODUCTION $development_mode = PRODUCTION; #Website root path for links $app_path = 'http://192.168.0.234/dealer/'; #User interface files path $ui_path = 'ui/'; #Image gallery path $gallery_path = 'ui/gallery/'; $mysqlserver = "localhost"; $mysqluser = "root"; $mysqlpass = ""; $mysqldb = "dealer_plus";?>
любые сомнения, пожалуйста, прокомментируйте
Comments