在PHP web应用程序中保存配置变量的最佳方法是什么?
我经常在.NET和PHP开发之间切换。使用ASP.NET站点我将配置信息(例如连接字符串、目录、应用程序设置)保存在web.config文件中,该文件受到适当保护,易于访问值等 在PHP中,我使用一个类来解决这个问题,该类对每个变量都有静态方法:在PHP web应用程序中保存配置变量的最佳方法是什么?,php,configuration,Php,Configuration,我经常在.NET和PHP开发之间切换。使用ASP.NET站点我将配置信息(例如连接字符串、目录、应用程序设置)保存在web.config文件中,该文件受到适当保护,易于访问值等 在PHP中,我使用一个类来解决这个问题,该类对每个变量都有静态方法: class webconfig { public static function defaultPageIdCode() { return 'welcome'; } } 该文件被应用程序包含,通过一行访问变量: $dp
class webconfig {
public static function defaultPageIdCode() {
return 'welcome';
}
}
该文件被应用程序包含,通过一行访问变量:
$dp = webconfig::defaultPageIdCode();
由于PHP不是编译的,因此很容易telnet进入并更改网站的值,因此此解决方案运行得相当好,并为我提供了以下两个优点:
- 我可以向配置变量添加逻辑,而不中断其与应用程序的接口
- 这些配置变量在my中显示为intellisense,例如Eclipse、NetBeans等
尤其是那些拥有大量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';
}