PHP: Существует ли правильный метод сохранения данных конфигурации?


У меня есть файл config.inc в веб-приложении, которое я создаю. Он содержит массив со значениями конфигурации для таких вещей, как база данных MySQL и т.д. Я хотел бы, чтобы они были введены с помощью простой формы, которая запрашивает сервер, логин/пароль для базы данных и т. Д., Затем Они записываются в файл конфигурации.

Существует ли предпочтительный способ сделать это? Я не уверен, как записать в файл и обновить массив.

Author: Peter Mortensen, 2010-02-08

8 answers

Ты просто хочешь писать, верно? Это сериализованный массив или он анализируется?

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

Другим способом было бы написать "config.inc.php "и просто включите его, чтобы написать его, вы просто выведете фактический PHP-код (например, $var = "myval";).

.

Это способ, которым вы могли бы написать простую функцию "вывода", которая принимала массив значения конфигурации и выведите их как имя=значение, предполагая, что $config был ассоциативным массивом.

foreach ($config as $name => $value) {
   $output .= $name . '=' . $value . "\n";
}

if (!file_put_contents($filename, $output)) {
    die("Error writing config file.");
}

Есть много достойных способов сделать это. Это действительно основано на ваших требованиях. Нужно ли быть в определенном формате или у вас есть свобода действий?

 2
Author: Xorlev, 2010-02-07 21:49:35

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

Пример сохранения данных:

$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$csvData = array();

foreach ($csvStructure as $field) {
   $csvData[] = $_POST[$field]; // so it'd get $_POST["dbUser"],$_POST["dbPasword"], etc..
}
file_put_contents("filename",implode("\t",$csvData));

Пример загрузки данных:

$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$dbConfig = array();
$csvData = explode("\t",file_get_contents("filename"));    
foreach ($csvStructure as $key => $field) { // $key would have the location of the requested field in our CSV data (0,1,2, etc..).
   $dbConfig[$field] = $csvData[$key]; // populate $dbConfig["dbUser"],$dbConfig["dbPasword"], etc..
}
 1
Author: Saggi Malachi, 2010-02-07 21:53:46

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

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

 1
Author: useless, 2010-12-07 11:05:42

Ну, чтобы написать файл, функция php fwrite() делает именно то, что вы хотите. Из его PHP.Страница СЕТЕВОЙ документации (см. пример ниже).

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

$strDatabaseConfig = "\$databaseConfig = array('" . $_POST['login'] . "," . $_POST['password'] . "');";

И вот фрагмент для запись:

$filename = 'test.txt';
$somecontent = "Add this to the file\n";

// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {

    // In our example we're opening $filename in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $somecontent will go when we fwrite() it.
    if (!$handle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($handle);

} else {
    echo "The file $filename is not writable";
}
 0
Author: Alex Weinstein, 2010-02-07 21:40:13

Вот один из способов: wp-admin/setup-config.php из WordPress.

 0
Author: Annika Backstrom, 2010-02-07 21:49:20

В PHP есть специальная функция для этого, она называется var_экспорт();

Просто сделайте:

file_put_contents("config.php",var_export($config,true));
 0
Author: RobertPitt, 2010-12-07 11:09:11

Я предпочитаю иметь файл с кучей определяющих операторов.

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

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

 0
Author: Ian Wood, 2010-12-07 12:31:34

Допустим, ваш файл config.inc выглядит следующим образом:

$config = array(
    'blah'  => 'mmm',
    'blah2' => 'www',
    //...
);

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

$newConfig = ...; // data from form - of course validate it first
$config = ...;    // data from config.inc

$config = array_merge($config, $newConfig);
file_put_contents('config.inc', '<?php $config = ' . var_export($config, true));

И ты закончил.

 -4
Author: Crozin, 2010-02-07 21:45:35