我要创建我的PHP项目配置文件,但我不知道该怎么办最好的方法是。
我有3个想法而已。
1用变量
$config['hostname'] = "localhost";
$config['dbuser'] = "dbuser";
$config['dbpassword'] = "dbpassword";
$config['dbname'] = "dbname";
$config['sitetitle'] = "sitetitle";
2,使用常量
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('TITLE', 'sitetitle');
3利用数据库
我将使用在类的配置,所以我不知道哪种方法是最好的,或者有更好的办法。
Answer 1:
我在这里接受的答案,它已经获得了upvotes数量颇为惊讶。 与马尔西奥Mazzucato的回答外,没有任何的多种方法的相对优点/弱点的讨论。
我看到的选项:
基于文件的机制
这些都需要你的代码看起来他们在特定地点找到ini文件。 这是一个难以解决的问题,其中一个总是在大型PHP应用程序庄稼了。 然而,你可能会需要解决,以便找到其被纳入/在运行时重新使用的PHP代码的问题。
这种常见的方法是要始终使用相对目录,或从当前目录下搜索向上找一个应用程序的基本目录专门命名的文件。
用于配置文件常见的文件格式是PHP代码,INI格式的文件,JSON,XML,YAML和系列化PHP
PHP代码
这提供了很大的灵活性用于表示不同的数据结构,以及(假设它被处理通过包括或要求)所解析的代码将可从所述操作码缓存 - 赋予性能益处。
所述的include_path提供用于提取的文件的潜在位置,而不依赖于额外的代码的装置。
在另一方面,主要的原因为从码分离配置中的一个是分离的责任。 它提供了用于注入额外的代码到运行时的路线。
如果配置是由工具创建的,有可能验证在工具中的数据,但有逃避数据嵌入PHP代码存在HTML,网址,MySQL的声明,shell命令没有标准的功能... 。
串行化的数据这是少量的配置(高达大约200个项目)相对高效和允许使用任何PHP数据结构。 它需要很少的代码创建/解析数据文件(这样你就可以,而不是花费在确保文件仅在适当的授权书面你的努力)。
写入到文件内容转义是自动处理。
既然你可以序列化对象,它只需通过读取配置文件(__wakeup魔术方法)创建调用代码的机会。
结构化文件
存储它作为一个INI文件由Marcel或JSON作为建议或XML还提供了一个简单的API来将文件映射到一个PHP数据结构(与XML的例外,为了躲避数据和创建文件),同时消除的代码调用漏洞利用系列化PHP数据。
这将有类似的性能特点,以序列化的数据。
数据库存储
这是最好的考虑,你有一个巨大的配置量,但在所需要的当前任务选择 - 我很惊讶地发现,在大约150个数据项,这是更快地检索本地MySQL实例,而不是数据反序列化数据文件。
OTOH它不保存凭证的好地方,你用它来连接到数据库!
执行环境
您可以在设定值运行环境 PHP在运行。
这消除了对PHP代码来查找在为配置特定地方的任何要求。 OTOH它不能很好地扩展到大量的数据,并且难以在运行时普遍改变。
在客户端
我还没有用于存储配置数据提到的一个地方是在客户端。 同样,网络开销意味着,这不很好地扩展到大量配置。 而且,由于最终用户拥有它必须存储在一个格式的数据控制,其中任何篡改是可检测的(即,具有一个加密的签名),并且不能包含其通过其披露损害的任何信息(即可逆加密)。
相反,这有很多的用于存储由最终用户拥有的敏感信息的好处 - 如果你没有这个存储在服务器上,它不能从那里偷来的。
网络目录另一个有趣的地方来存储配置信息是DNS / LDAP。 这将为少数小片的信息化工作-但你并不需要坚持1范式-考虑,例如SPF 。
在基础建设支持缓存,复制和分发。 因此,它可以很好地用于非常大的基础设施。
版本控制系统
配置方面,如代码应加以管理和控制的版本 - 因此直接从您的VC系统获得的配置是一个可行的解决方案。 但往往这种配有显著的性能开销,因此缓存可能是可取的。
Answer 2:
一个简单而优雅的方式是创建一个config.php
文件(或者无论你怎么称呼它),只是返回一个数组:
<?php
return array(
'host' => 'localhost',
'username' => 'root',
);
然后:
$configs = include('config.php');
Answer 3:
使用INI文件是一个灵活和强大的解决方案! PHP有一个本地函数来妥善处理。 例如,它可以创建一个这样的INI文件:
app.ini
[database]
db_name = mydatabase
db_user = myuser
db_password = mypassword
[application]
app_email = mailer@myapp.com
app_url = myapp.com
所以,你需要做的唯一的事情就是调用:
$ini = parse_ini_file('app.ini');
然后你就可以轻松的通过访问定义$ini
阵列。
echo $ini['db_name']; // mydatabase
echo $ini['db_user']; // myuser
echo $ini['db_password']; // mypassword
echo $ini['app_email']; // mailer@myapp.com
重要提示:出于安全原因,INI文件必须在一个非公开的文件夹
Answer 4:
我用的@hugo_leonardo的轻微变化的解决方案 :
<?php
return (object) array(
'host' => 'localhost',
'username' => 'root',
'pass' => 'password',
'database' => 'db'
);
?>
这使您可以使用对象语法,当你包括PHP: $configs->host
,而不是$configs['host']
另外,如果您的应用程序有CONFIGS你需要在客户端(如一个角度应用程序),你可以有这样config.php
文件包含所有的configs(在一个文件,而不是一个JavaScript和一个用于PHP集中)。 然后诀窍将有将另一个PHP文件echo
只在客户端信息(可避免信息你不希望显示像数据库连接字符串)。 说它说get_app_info.php
:
<?php
$configs = include('config.php');
echo json_encode($configs->app_info);
?>
以上假设你的config.php
包含app_info
参数:
<?php
return (object) array(
'host' => 'localhost',
'username' => 'root',
'pass' => 'password',
'database' => 'db',
'app_info' => array(
'appName'=>"App Name",
'appURL'=> "http://yourURL/#/"
)
);
?>
所以,你的数据库中的信息保持在服务器端,但您的应用程序的信息是从你的JavaScript访问,与例如$http.get('get_app_info.php').then(...);
呼叫类型。
Answer 5:
嗯 - 这将是有点难以存储在数据库中的数据库配置数据 - 不遐想?
不过说真的,这是一个相当严重的问题自以为是,因为任何风格的作品真的和它的偏好是所有问题。 就个人而言,我会去配置变量,而不是常量 - 通常是因为我不喜欢,除非必要的全局空间的东西。 在我的代码库中的所有功能都应该能够很容易地访问我的数据库密码(除了我的数据库连接逻辑) - 所以我没有使用它,那么有可能摧毁它。
编辑 :回答您的评论-没有解析机制将是最快的(INI,JSON等) -但他们也没有你的应用程序,你真的很需要关注,因为速度差优化部分将就这种小文件可以忽略不计。
Answer 6:
定义将在您的课常随处可见,而无需使用全局,而变量需要在全球一流的,我会用DEFINE。 但同样,如果分贝PARAMS应程序执行过程中改变你可能要坚持使用变量。
Answer 7:
如果你认为你将使用超过100分贝以任何理由,去的变量,因为你可以改变一个参数,切换到一个完全不同的分贝。 即进行测试,自动备份等。
Answer 8:
您可以创建一个配置类巫婆静态属性
class Config
{
static $dbHost = 'localhost';
static $dbUsername = 'user';
static $dbPassword = 'pass';
}
那么你可以简单的使用它:
Config::$dbHost
有时,在我的项目,我使用设计模式辛格尔顿访问配置数据。 这是在使用中非常舒适。
为什么?
例如,你在你的项目2个数据源。 你可以选择其中的女巫被启用。
某处在配置文件中选择:
$dataSource = 'mysql' // or 'json'
当您更改源整个应用程序768,16切换到新的数据源,做工精细并且不需要在代码中更改。
例:
配置:
class Config
{
// ....
static $dataSource = 'mysql';
/ .....
}
Singleton类:
class AppConfig
{
private static $instance;
private $dataSource;
private function __construct()
{
$this->init();
}
private function init()
{
switch (Config::$dataSource)
{
case 'mysql':
$this->dataSource = new StorageMysql();
break;
case 'json':
$this->dataSource = new StorageJson();
break;
default:
$this->dataSource = new StorageMysql();
}
}
public static function getInstance()
{
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function getDataSource()
{
return $this->dataSource;
}
}
...某处在你的代码(例如,在一些服务类。):
$container->getItemsLoader(AppConfig::getInstance()->getDataSource()) // getItemsLoader need Object of specific data source class by dependency injection
我们可以从系统中的任何地方获得的AppConfig对象,总是得到相同的副本(感谢静态)。 类的init()方法被调用在构造,这保证只有一个执行。 的init()身体检查设置$数据源的值,并创建特定的数据源的新的类对象。 现在,我们的脚本可以获取对象,并对其进行操作,不知道即使是具体的实施确实存在。
Answer 9:
我通常最终创建出具有我的数据库连接的单个conn.php文件。 然后,我包括需要数据库查询的所有文件,该文件。
Answer 10:
这是我的方式。
<?php
define('DEBUG',0);
define('PRODUCTION',1);
#development_mode : DEBUG / PRODUCTION
$development_mode = PRODUCTION;
#Website root path for links
$app_path = 'http://192.168.0.234/dealer/';
#User interface files path
$ui_path = 'ui/';
#Image gallery path
$gallery_path = 'ui/gallery/';
$mysqlserver = "localhost";
$mysqluser = "root";
$mysqlpass = "";
$mysqldb = "dealer_plus";
?>
有任何疑问,请发表评论
文章来源: Creating a config file in PHP