2010-02-07 8 views
6

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

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

+0

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

+0

Да, я убедился в этом, он недоступен Apache. –

+0

Как бы вы это описали, если Apache не может даже получить к нему доступ? :) –

ответ

2

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

Один из способов чтения конфигурационного файла - 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."); 
} 

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

+0

Нет, он не должен находиться в определенном формате файла. –

+0

Для приложений большого масштаба я обычно использую parse_ini_file() для синтаксического анализа файла конфигурации; или обернуть необходимую информацию в массив или текстовый файл для разбора для быстрого n-грязного материала. –

0

Ну, чтобы написать файл, функция fwrite() php делает именно то, что вы хотите. На странице документации на 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"; 
} 
-4

Допустим, ваш файл 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)); 

И все готово.

+2

Публикация таких опасных решений, заканчивающихся словами «И все готово», безответственно. –

+0

@Nic Hubbard: Пожалуйста, убедитесь, что вы подтверждаете ввод всех пользователей и убедитесь, что форма для заполнения этих данных защищена на 100% и доступна только для авторизованных администраторов. Помните, что этот файл затем включен в ваше приложение и вводит вредоносный код, это просто прост. –

+1

Если '$ newConfig' поступает из надежного источника и проверен правильно, то это безопасное решение (я написал это в коде). Также пока вы не напишете что-то вроде этого: 'include 'config.inc'; eval ($ config); 'довольно сложно выполнить плохой код. [var_export()] (http://pl.php.net/manual/en/function.var-export.php) превратит любой плохой код в обычную строку, поэтому конечный результат будет таким же, как если бы вы сохранили конфигурации в базе данных. Поэтому, пожалуйста, представьте мне пример действительно опасной ситуации или объясните, почему вы проголосовали. – Crozin

1

Не рекомендуется изменять файлы конфигурации 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

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

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

0

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

Вобще:

file_put_contents("config.php",var_export($config,true)); 
0

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

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

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