PHP:是否有正确的方法来保存配置数据?

时间:2010-02-07 21:31:39

标签: php arrays config

我正在构建的Web应用程序中有一个config.inc文件。它包含一个包含MySQL数据库等配置值的数组。我希望通过使用一个简单的表单来输入这些数据,这个表单要求服务器,数据库的登录/密码等,然后将这些写入配置文件。

有这样做的首选方法吗?我不知道如何写入文件,并更新数组。

8 个答案:

答案 0 :(得分:2)

你只想写作,对吗?它是序列化数组还是已解析?

读取配置文件的一种方法是parse_ini_file()。我不一定称之为首选,但这是一种方法。你仍然需要写这个文件。

另一种方法是编写一个“config.inc.php”并将其包含在内,为了编写它你只输出实际的PHP代码(例如$ var =“myval”;)。

这是一种可以编写一个简单的“输出”函数的方法,它接受一组配置值并将它们输出为name = value,假设$ config是一个关联数组。

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

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

有很多不错的方法可以做到这一点。这真的是基于你的要求。是否需要以特定格式存在或者您是否有余地?

答案 1 :(得分: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..
}

答案 2 :(得分:1)

我相信使用ini文件是一个明智的选择,因为用户,密码,架构,路径等通常会手动修改,所以使用var_export不是因为手工修改它它不是那么干净,如果你在PHP语法中犯了错误,可能会使你的应用程序崩溃。

但解析大的ini文件可能会很昂贵,因此可以使用var_export()serlialize()缓存ini。我认为这是一个更好的选择,只有当缓存文件不存在时才读取ini。

答案 3 :(得分: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 :(得分:0)

这是一种方式:来自WordPress的wp-admin/setup-config.php

答案 5 :(得分:0)

PHP有一个专门的功能,它叫做 var_export();

只是做:

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

答案 6 :(得分:0)

我更喜欢带有一堆定义语句的文件。

这些是全局可用的常量(当然也是不可变的),这是配置设置所需的。

常量提供更好的内存管理和读取效率,因为它们不需要变量所需的额外内存,因此可以更改。

答案 7 :(得分:-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));

你已经完成了。