在PHP web应用程序中保存配置变量的最佳方法是什么?

在PHP web应用程序中保存配置变量的最佳方法是什么?,php,configuration,Php,Configuration,我经常在.NET和PHP开发之间切换。使用ASP.NET站点我将配置信息(例如连接字符串、目录、应用程序设置)保存在web.config文件中,该文件受到适当保护,易于访问值等 在PHP中,我使用一个类来解决这个问题,该类对每个变量都有静态方法: class webconfig { public static function defaultPageIdCode() { return 'welcome'; } } 该文件被应用程序包含,通过一行访问变量: $dp

我经常在.NET和PHP开发之间切换。使用ASP.NET站点我将配置信息(例如连接字符串、目录、应用程序设置)保存在web.config文件中,该文件受到适当保护,易于访问值等

PHP中,我使用一个类来解决这个问题,该类对每个变量都有静态方法:

class webconfig {
    public static function defaultPageIdCode() {
        return 'welcome';
    }
}
该文件被应用程序包含,通过一行访问变量:

$dp = webconfig::defaultPageIdCode();
由于PHP不是编译的,因此很容易telnet进入并更改网站的值,因此此解决方案运行得相当好,并为我提供了以下两个优点

  • 我可以向配置变量添加逻辑,而不中断其与应用程序的接口
  • 这些配置变量在my中显示为intellisense,例如Eclipse、NetBeans等
但我可以想象,还有其他方法可以解决在PHP中保存web配置设置的问题,这可能还有其他优势


尤其是那些拥有大量PHP框架经验的人,还有哪些保存配置变量的方法及其优缺点?

我这样做的方式是直接将它们存储在
数组中
并将文件另存为config.PHP

<?php

$config['dbname'] = "mydatabase";
$config['WebsiteName'] = "Fundoo Site";
$config['credits'] = true;
$config['version'] = "4.0.4";

?>

这是大多数PHP框架(如Wordpress等)的工作方式。

在PHP中,我总是使用“.htaccess”来保护配置文件(双重保护)

注意:“最佳方式”永远不存在。每个应用程序和框架都有自己的风格。虽然您的示例正在使用这个技巧,但我认为对于一个简单的配置文件来说,它有点占用大量资源

  • 您可以使用单个变量(如Amber)来完成此操作
  • 您可以使用阵列来实现这一点,这是最常见的方法,您可以随时轻松地编辑配置文件
  • 您可以使用PHP提供的.ini文件来完成此操作
编辑:


Edward请看一下parse_ini_文件的示例。您可以使用一个简单的命令加载.ini文件,然后您可以在一个类中使用变量,如您的示例中所示

通常的方法是使用
定义

define('MYSQL_USER', 'ROOT');
并通过
MYSQL\u USER
在整个应用程序中访问它:

$user = MYSQL_USER;

但是,这种方式不支持数组。

我认为有很多可能性,但最常用的方法是将纯文本存储在.csv、.ini、.xml等文件中。通过一些小技巧,您可以保护这些文件,这样就没有人可以直接加载这些文件

INI文件示例:

;<?php die(); ?>
[config1]
var1 = 'value1';
var2 = 'value2';
...
[config2]
...
;
[配置1]
var1='value1';
var2='value2';
...
[配置2]
...
在ini文件中被视为注释。因此,当您使用ini解析器读入文件时,这一行将被忽略。如果有人通过url直接访问该文件,将执行
die()
-函数。这只适用于INI文件的扩展名为.php的情况,以便服务器知道应该执行该文件,而不是将其显示为纯文本

大多数基于文件的配置存储的可能缺点是某些utf8字符存在问题


是Zend Framework的一个组件,它为具有易于使用的api的多个存储适配器提供了可能性。

很少有可能:

  • 您可以使用配置文件(ini、json、xml或yaml)。对于ini,您有
    parse\u ini\u file
    ;对于JSON,您有
    JSON\u decode
    (+file\u get\u contents);对于YAML,您必须使用外部库(搜索sfYaml)

  • 您可以有一个包含变量或常量的配置文件(更好地用于不可变配置,并且可以在所有范围内访问),您可以将其包含在脚本中:

    定义('ROOT_DIR','\home\www')

    $sRootDir='\home\www'

  • 如果您是面向对象的,您可以将其包装在类中,作为属性-您没有针对每个属性的getter方法,您可以:

    class Config
    {
        public $var1 = 'xxx';
        public $var2 = 'yyy';
    }
    
    ($c=new Config();打印$c->var1)

    (打印c:$var1)


    最好是使用registry类型类,实现单例模式并能够从给定文件读取配置。

    我倾向于在PHP中使用设置静态类,这是因为

    • 它具有全球范围
    • 您可以启用/禁用对受保护配置的更改
    • 您可以在运行时的任何位置添加任何设置
    • 您可以使该类自动从文件/数据库获取公共配置
    例如:

    abstract class Settings
    {
        static private $protected = array(); // For DB / passwords etc
        static private $public = array(); // For all public strings such as meta stuff for site
    
        public static function getProtected($key)
        {
            return isset(self::$protected[$key]) ? self::$protected[$key] : false;
        }
    
        public static function getPublic($key)
        {
            return isset(self::$public[$key]) ? self::$public[$key] : false;
        }
    
        public static function setProtected($key,$value)
        {
            self::$protected[$key] = $value;
        }
    
        public static function setPublic($key,$value)
        {
            self::$public[$key] = $value;
        }
    
        public function __get($key)
        {//$this->key // returns public->key
            return isset(self::$public[$key]) ? self::$public[$key] : false;
        }
    
        public function __isset($key)
        {
            return isset(self::$public[$key]);
        }
    }
    
    然后在运行时内,如果先加载此文件,然后加载数据库配置文件,则数据库配置文件如下所示:

    <?php
    Settings::setProtected('db_hostname', 'localhost');
    Settings::setProtected('db_username', 'root');
    Settings::setProtected('db_password', '');
    Settings::setProtected('db_database', 'root');
    Settings::setProtected('db_charset', 'UTF-8');
    //...
    echo Settings::getProtected('db_hostname'); // localhost
    //...
    Settings::setPublic('config_site_title', 'MySiteTitle');
    Settings::setPublic('config_site_charset', 'UTF-8');
    Settings::setPublic('config_site_root', 'http://localhost/dev/');
    
    不管我们使用这个对象作为静态对象的事实如何,这些值应该仍然存在于模板中,您现在可以这样做,比如说

    <html>
        <head>
            <?php echo isset($settings->config_site_title) ? $settings->config_site_title : 'Fallback Title'; ?>
        </head>
    </html>
    
    
    
    这只允许您在初始化期间访问公共数据

    这可能会变得更复杂,但对系统更友好,例如:

    • 自动解析配置文件、xml、php、yaml的
      loadConfig
      方法
    • 如果注册了
      shutdown\u功能
      ,则可以使用新设置自动更新数据库
    • 您可以使用该数据库中的配置自动填充该类
    • 您可以实现迭代器,使其与循环兼容
    • 还有很多

    这也是迄今为止完成这项工作的最佳方法。

    由于PHP能够使用OO,我喜欢使用“配置类”:


    使用Config::DB\u驱动程序很容易访问。无需包含该文件,因为应用程序自动加载程序将为您执行此操作。当然,仍然需要保护文件。

    Telnet?天哪,我已经跌入了时间扭曲,在1992年来到这里

    但说真的,IIRC有一些工具允许asp.net(和其他语言)解析会话数据,这是ju
    $template = new Template();
    $template->assign('settings', new Settings());
    
    <html>
        <head>
            <?php echo isset($settings->config_site_title) ? $settings->config_site_title : 'Fallback Title'; ?>
        </head>
    </html>
    
    class Config
    {
        /**
         * ---------------------------------
         * Database - Access
         * --------------------------------- 
         */
    
        /**
         * @var String
         */
        const DB_DRIVER = 'pgsql';
    
        const DB_USER = 'postgres';
    
        const DB_PASSWORD = 'postgres';
    
        const DB_NAME = 'postgres';
    }