0

我有一个标准的配置文件:$variable = 'value';,但在最后一刻想用网络界面来配置它。那么读取文件,找到变量值然后再次重新保存文件的最佳方法是什么?

目前我有2个想法:

1) RegExp
2) 保留某处数组示例

4

2 回答 2

1

将所有配置值存储在关联数组中,如下所示:

$config = array(
   'variable' => 'value'
);

对于 Web 界面,您可以轻松地遍历整个数组:

foreach($config as $key=>$value) { ... }

进行更改后,循环遍历数组并将其写回文件。(不过,您确实应该为此使用数据库)。

包含文件时,您可以像这样使用它:

include('config.php');

echo $config['variable']
// or
extract($config);
echo $variable;

注意:如果您提取,它将覆盖您在提取之前可能已定义的同名变量。

PS - 为了更容易读取和写入文件,我只使用 json 编码来序列化数组。

于 2012-09-26T06:05:31.387 回答
0

使用数据库

如果您的配置是用户定义的 - 最好将配置存储在数据库中。否则,您需要解决这个“新”问题,但也可能会引入安全问题。即任何一个用户都能够编辑您的配置文件——它们必须对网络服务器用户是可写的。这为通过网络漏洞将恶意代码注入此文件打开了大门 - 或者只是直接访问您的服务器(共享主机?)的人找到这个可写文件并根据他们的喜好更新它(例如,将“ <?php header('Location: my site'); die;”放入其中)。

一个配置变量

如果您必须使用配置文件管理它,请包含文件以读取它,并var_export变量以写入它。如果只有一个配置变量,那就是数组,这是最容易做到的。例如:

function writeConfig($config = array()) {
    $arrayAsString = var_export($config, true);
    $string = "<?php\n";
    $string .= "\$config = $arrayAsString;\n";
    file_put_contents('config.php', $string);
}

允许部分更新

如果您只更改一些变量 - 只需在重写之前包含配置文件:

function writeConfig($edits = array()) {
    require 'config.php';
    $edits += $config;

    $arrayAsString = var_export($edits, true);
    $string = "<?php\n";
    $string .= "\$config = $arrayAsString;\n";
    file_put_contents('config.php', $string);
}

多个配置变量

如果您的配置文件中有多个变量,请使用get defined vars并循环它们以将文件写回:

function writeConfig($_name = '', $_value) {
    require 'config.php';

    $$_name = $_value; // This is a variable variable
    unset($_name, $_value);

    $string = "<?php\n";
    foreach(get_defined_vars() as $name => $value) {
        $valueAsString = var_export($value, true);
        $string .= "\$$name = $valueAsString;\n";
        file_put_contents('config.php', $string);
    }
}

上面的代码使用了变量 variables,覆盖了配置文件中的一个变量。最后两个例子中的每一个都可以很容易地适应同时更新多个变量。

于 2012-09-26T06:07:29.957 回答