Создание файла конфигурации в 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-Использовать базу данных

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

67
4) Используйте файл ini. 5) Используйте файл YAML. 6) Используйте файл JSON. 7) ... Существует так много способов ... Определите некоторые критерии, чтобы судить по крайней мере, нет общего «лучшего».
добавлено автор deceze, источник
Это должно быть интересно прочитать для вас: PHP "> stackoverflow.com/questions/823352/…
добавлено автор eithed, источник
@deceze, что такое голодание? (память и быстро)
добавлено автор Cooper, источник
Я использую то, как это делает Laravel (когда он не использует Laravel). Я создаю класс, который загружает определенный файл конфигурации в зависимости от имени хоста. Затем я вызываю его, используя Config :: get ('key'); . pastebin.com/4iTnjEuM
добавлено автор MisterBla, источник

10 ответы

Один простой, но изящный способ - создать файл config.php (или все, что вы его называете), который просто возвращает массив:

<?php

return array(
    'host' => 'localhost',
    'username' => 'root',
);

А потом:

$configs = include('config.php');
143
добавлено
Мне тоже нравится этот метод - я думаю, что он чище, чем просто объявление переменной во включенном файле и предполагая, что он будет там в вашем скрипте
добавлено автор Colin M, источник
Где находится в этом ответе метод создания файла конфигурации? Для новичков PHP, таких как я?
добавлено автор Luka, источник
Простой и элегантный
добавлено автор Jose Rojas, источник
@Luka Вы можете использовать функцию var_export .
добавлено автор Hasan Bayat, источник

Использование 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['app_name'];//mypassword

IMPORTANT: For security reasons the INI file must be in a non public folder

42
добавлено
@NickGames, вы должны поместить файл в не общедоступную папку, иначе вы столкнетесь с серьезной угрозой безопасности
добавлено автор Marcio Mazzucato, источник
@danny, я уже использовал INI-файл в общих хостингах, и это было очень просто. Может быть, вы что-то неправильно поняли.
добавлено автор Marcio Mazzucato, источник
@MarcioMazzucato У меня были проблемы при написании на godaddy. Чтение возможно, но написание файлов ini не работает.
добавлено автор danny, источник
его трудно писать ini-файлы в общих хостингах.
добавлено автор danny, источник
@NickGames, посмотрите 1 комментарий в Документы parse_ini_file ( )
добавлено автор R Picheta, источник
Да, вы правы! Спасибо за ответ!
добавлено автор NickGames, источник
Безопасно ли это использовать? Если пользователь угадает путь к ini-файлу и отправится туда в своем браузере, увидит ли он, что находится в файле?
добавлено автор NickGames, источник

Я использую небольшую эволюцию решения @hugo_leonardo :

<?php

return (object) array(
    'host' => 'localhost',
    'username' => 'root',
    'pass' => 'password',
    'database' => 'db'
);

?>

This allows you to use the object syntax when you include the PHP : $configs->host instead of $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 содержит параметр app_info :

<?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'), затем (...); тип вызова.

19
добавлено
зачем делать его объектом?
добавлено автор TheCrazyProfessor, источник
Объекты также имеют побочный эффект передачи по ссылке с PHP 5. Это может быть или не быть хорошо. Массивы передаются по значению (но реализованы как COW), поэтому лучше использовать конфигурационные массивы вместо объектов конфигурации.
добавлено автор Mikko Rantalainen, источник
Создание этого объекта облегчает обработку данных. Это позволяет, например, получить все параметры app_info для JavaScript как JSON с минимальными строками кода.
добавлено автор BoDeX, источник
@BoDeX мне нравится этот путь всегда и, кажется, предпочтительный подход в большинстве статей, но как мне получить доступ к этому через класс? Я прочитал в статье о безопасности, что создание глобальных переменных не является хорошей идеей, так что вы предлагаете?
добавлено автор Kevlwig, источник

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

Возможные варианты:

Файловые механизмы

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

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

Обычные форматы файлов, используемые для файлов конфигурации, - это PHP-код, ini-форматированные файлы, JSON, XML, YAML и сериализованный PHP

PHP-код

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

include_path предоставляет средства для абстрагирования потенциальных местоположений файла, не полагаясь на дополнительный код.

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

Если конфигурация создается из инструмента, может быть возможно проверить данные в инструменте, но нет стандартной функции для удаления данных для встраивания в PHP-код, как это существует для HTML, URL-адресов, операторов MySQL, команд оболочки ... ,

Serialized data This is relatively efficient for small amounts of configuration (up to around 200 items) and allows for use of any PHP data structure. It requires very little code to create/parse the data file (so you can instead expend your efforts on ensuring that the file is only written with appropriate authorization).

Экранирование содержимого, записанного в файл, обрабатывается автоматически.

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

Структурированный файл

Хранение его как файла INI, предложенного Marcel или JSON или XML, также предоставляет простой api для сопоставления файла в структуру данных PHP (и за исключением XML, чтобы избежать данных и создания файла), в то же время устраняя вызов кода с использованием сериализованных данных PHP.

Он будет иметь схожие характеристики производительности с сериализованными данными.

Хранилище базы данных

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

OTOH - это не лучшее место для хранения учетных данных, которые вы используете для подключения к вашей базе данных!

Условия выполнения

Вы можете установить значения в рабочей среде , в которой работает PHP.

Это устраняет любые требования к тому, чтобы PHP-код выглядел в определенном месте для конфигурации. OTOH не очень хорошо масштабируется для больших объемов данных и его трудно изменить повсеместно во время выполнения.

На клиенте

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

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

Network Directories Another interesting place to store configuration information is in DNS/LDAP. This will work for a small number of small pieces of information - but you don't need to stick to 1st normal form - consider, for example SPF.

Инфраструктура поддерживает кеширование, репликацию и распространение. Следовательно, он хорошо работает для очень больших инфраструктур.

Системы контроля версий

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

9
добавлено

Ну, было бы сложно хранить данные конфигурации базы данных в базе данных - не так ли?

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

Edit: to answer your comment - none of the parsing mechanisms would be the fastest (ini, json, etc) - but they're also not the parts of your application that you'd really need to focus on optimizing since the speed difference would be negligible on such small files.

6
добавлено

Если вы думаете, что по какой-то причине вы будете использовать более 1 дБ, перейдите к переменной, потому что вы сможете изменить один параметр, чтобы переключиться на совершенно другой бит. То есть для тестирования, autobackup и т. д.

2
добавлено

Define сделает константу доступной повсюду в вашем классе, не используя глобальную, в то время как переменная требует глобального класса, я бы использовал DEFINE. но опять же, если параметры db должны меняться во время выполнения программы, вы можете захотеть придерживаться переменной.

2
добавлено
@CooPer Определение констант значительно медленнее, чем определение переменных. Но использование их немного быстрее. Поскольку они будут использоваться в одном месте, переменные будут в целом обеспечивать более высокую производительность.
добавлено автор Colin M, источник
@phpalix Определение константы может быть где угодно от 10-20x медленнее, чем определение переменной с тем же значением. Я бы сказал, что это важно. Однако, если вы используете постоянную значительную нагрузку по всему вашему приложению, это может очень хорошо окупиться. Но создать константу для ее использования один раз не рекомендуется.
добавлено автор Colin M, источник
что такое быстрый способ выполнить php? const или var?
добавлено автор Cooper, источник
«Значительно» - это немного тяжелое слово для этого, если вы будете смотреть на него таким образом, возможно, вам следует связаться с парнями-разработчиками PHP и попросить их удалить постоянную поддержку!
добавлено автор phpalix, источник

Обычно я создаю единственный файл conn.php с моими подключениями к базе данных. Затем я включаю этот файл во все файлы, требующие запросов к базе данных.

2
добавлено
Я знаю это, но как вы сохраняете свой файл базы данных с переменной или константой? и почему?
добавлено автор Cooper, источник

Вы можете создавать статические свойства класса класса конфигурации

class Config 
{
    static $dbHost = 'localhost';
    static $dbUsername = 'user';
    static $dbPassword  = 'pass';
}

то вы можете просто использовать его:

Config::$dbHost  

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

Зачем?

Например, у вас есть 2 источника данных в вашем проекте. И вы можете выбрать, что ведьма из них включена.

  • MySQL
  • JSON

Где-то в файле конфигурации вы выбираете:

$dataSource = 'mysql'//or 'json'

Когда вы меняете исходное целое приложение shoud на новый источник данных, работайте нормально и не нуждаетесь в изменении кода.

Пример:

Config:

class Config 
{
 //....
  static $dataSource = 'mysql';
 /.....
}

Singleton класс:

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 и создание нового объекта определенного класса источника данных. Теперь наш скрипт может получить объект и действовать на нем, не зная даже эта конкретная реализация фактически существует.

2
добавлено

Вот мой путь.

<?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";

?>

Любые сомнения, пожалуйста, прокомментируйте

1
добавлено
Здравствуйте! Не могли бы вы привести пример использования? спасибо
добавлено автор Nick, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp