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

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

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

6
задан Peter Mortensen 7 December 2010 в 11:07
поделиться

6 ответов

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

Один из способов чтения файла конфигурации - 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
ответ дан 17 December 2019 в 22:12
поделиться

Не рекомендуется изменять файлы конфигурации 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
ответ дан 17 December 2019 в 22:12
поделиться

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

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

1
ответ дан 17 December 2019 в 22:12
поделиться

Чтобы написать файл, функция php fwrite () делает именно то, что вы хотите. Со страницы документации PHP.NET (см. Пример ниже).

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

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

А вот фрагмент для fwrite:

$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
ответ дан 17 December 2019 в 22:12
поделиться

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

0
ответ дан 17 December 2019 в 22:12
поделиться

Допустим, ваш файл 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
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: