更新config.php的最佳方法

时间:2010-08-07 08:13:56

标签: php config fopen fwrite

我的某个网站有一个config.php文件,其中包含运行该网站所需的信息。它有点像这样:

<?php

$site_name="The Site";
$base_url = "http://site.com";
$upload_path = "/images";

?>

从中获取值很简单,我只使用require 'config.php';但是如何从html表单中添加选项呢?意味着我如何更新价值观?我想到的一种方法是使用fopen和fsave,有点像这样:

<?php
$filename = 'config.php';
$somecontent = "config here";


if (is_writable($filename)) {


    if (!$handle = fopen($filename, 'w')) {
         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";
}
?>

但这是执行此操作的标准方法吗?这是所有这些cms写出配置文件的方式吗?

7 个答案:

答案 0 :(得分:4)

$cfg['sitename'] = $_POST['sitename'];

$file     = "config.php";
$contents = "<?php\r\n\$cfg=".var_export($cfg,1).";\r\n?>";

file_put_contents($file,$contents);

答案 1 :(得分:3)

好吧,我不喜欢重写PHP脚本(config.php)的想法。

我认为更好的解决方案是拥有一个config.ini文件(您必须保护对文件的访问权限。您可以通过.htaccess文件执行此操作,或者您可以将文件移出document_root范围)并阅读文件。

config.ini内容:

 key1 = value
 key2 = value
 key3 = value
 key4 = value

注意:

  • config.ini会比config.php慢一点,但对于非关键网站来说,它会没问题
  • config.ini应该是比使用数据库
  • 更好的选择
  • 作为config.ini的一个优点,我看到没有人可以在你的config.php中添加php脚本
  • PHP包含用于解析ini文件的函数parse_ini_fileexample of usage
  • 您可以将ini文件的内容划分为部分和模式:

 [Production]
 mysql_server = value
 mysql_username = value
 ...

[Development] mysql_server = value mysql_username = value ...

答案 2 :(得分:2)

写入.php文件根本不是一个好主意。最好将配置存储在数据库,.ini文件或xml文件中。使用这个“存储”进行配置使其非常易于读写。

注意:请注意,您应该从文档根目录中输出.ini,.xml文件,以避免从Web访问它。

另外,我建议你检查Zend Config http://framework.zend.com/manual/ru/zend.config.html,了解如何在OOP MVC框架中实现对配置的写入。

答案 3 :(得分:1)

您可以使用模板引擎为config.php创建模板,例如Smarty的

<强> config.tpl

<?php
     // DB Settings
     $db_host = "{$db->host}";
     $db_user = "{$db->user}";
     $db_password = "{$db->password}";
     ...

使用Smarty为您渲染 config.php 并捕获输出并保存到真实配置文件。

<?php
      $smarty->assign('db', $db);
      $output = $smarty->fetch('config.tpl');
      // ...save the output into config.php

使用此方法的优点是您可以分离配置文件的布局和内容,例如您可以在配置文件中添加额外的注释,或轻松安排项目的订单。

此外,使用此方法,您可以轻松转移到其他格式,如 INI XML 格式,如其他人所建议的那样。

答案 4 :(得分:1)

我已经使用tszming的模板解决方案一段时间了,如果您已经轻松使用Smarty或其他模板系统,它可以正常工作,否则可能需要付出太多精力来保存您的配置。

更简单的解决方案是在数组中包含所有配置选项,并将其保存在编码为JSON的文件中。在每个脚本的开头,您file_get_contents()json_decode()将设置文件放入数组中。每当您想要保存当前选项时json_encode()选项数组,并使用file_put_contents()写入设置文件。 这允许PHP以最小的麻烦读取和编写配置,但您仍然可以使用文本编辑器对其进行编辑。

答案 5 :(得分:0)

我想这就是大多数CMS的管理面板如何允许您直接写入配置文件,但是:

  • 在执行此操作之前,您应该确保提交者已经过管理员身份验证。
  • REGISTER_GLOBALS最好也应该关闭,尽管这比一般情况下与此有关的更多是安全问题。

答案 6 :(得分:0)

我个人经验的建议是将最基本的东西保存在配置文件(数据库连接)和数据库表中的其他所有内容中。你应该总是尽量避免在服务器上写东西,除非你真的不得不遇到许可问题,安全问题等等......

当您想要分发这样的脚本时,它变得越来越重要。

其余的,与上面的答案非常相似:

<?php
$config = "<?php\r\n";

$file     = "/path/to/config.php";

foreach ( $_POST [ 'config' ] as $config_label => $config_value ):
    $config .= "$$config_label = '{$config_value}'\r\n";
endforeach;

file_put_contents($file,$config);
祝你好运。