У меня есть a config.inc
файл в веб-приложении, которое я создаю. Это содержит массив со значениями конфигурации для вещей как база данных MySQL и т.д. Я хотел бы, чтобы они были введены при помощи простой формы, которая просит сервер, вход в систему/пароль для базы данных, и т.д., затем они записаны в конфигурационный файл.
Существует ли предпочтительный метод выполнения этого? Я не уверен, как записать в файл и обновить массив.
Вы просто хотите написать, верно? Это сериализованный массив или он анализируется?
Один из способов чтения файла конфигурации - 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.");
}
Есть много достойных способов сделать это. Это действительно основано на ваших требованиях. Требуется ли , чтобы был в определенном формате, или у вас есть свобода действий?
Не рекомендуется изменять файлы конфигурации 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..
}
Я считаю, что использование ini-файла - это разумный вариант, потому что пользователь, пароль, схема, пути и т. Д. - это вещи, которые обычно изменяются вручную, поэтому используйте var_export
не потому, что его изменение вручную не так чисто и может привести к сбою приложения, если вы сделаете ошибку в синтаксисе PHP.
Но разбор больших файлов ini может быть дорогостоящим, поэтому было бы нормально кэшировать ini с помощью var_export ()
или serlialize ()
. Я думаю, это лучший выбор, и читать ini только тогда, когда файл кеша не существует.
Чтобы написать файл, функция 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";
}
Вот один способ: wp-admin / setup-config.php
из WordPress.
Допустим, ваш файл 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));
Готово.