我有一个用标准PHP(无框架或CMS)编写的网站,我有一小部分可配置的信息可以存储,而且我不想或不能存储它们一个数据库。如何在不使用数据库的情况下存储少量属性?
有:如数据库用户名和密码
- 全局属性。
- 内容像联系电话号码和地址。
我知道我可以“硬编码”这样的东西,但我想把它们放到一个不严格地说是“代码”的文件中。
有什么选择存储和哪些是适当的?
我有一个用标准PHP(无框架或CMS)编写的网站,我有一小部分可配置的信息可以存储,而且我不想或不能存储它们一个数据库。如何在不使用数据库的情况下存储少量属性?
有:如数据库用户名和密码
我知道我可以“硬编码”这样的东西,但我想把它们放到一个不严格地说是“代码”的文件中。
有什么选择存储和哪些是适当的?
在漂亮的标准PHP中有相当多的选项可供选择,主要取决于存储的信息类型以及将要编辑的信息。
“包含”是设置变量
可以使用include
或require
关键字包括建立了一系列然后可以将该文件外引用变量文件的另一个PHP文件。
E.g.
database_configuration.php
<?
$dbConfig['host'] = 'myhost';
$dbConfig['username'] = 'myuser';
$dbConfig['password'] = 'mypassword';
$dbConfig['database'] = 'mydatabase';
用法:
<?
include('database_configuration.php');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
这是很“老同学”,是如何很多人会已接近这样那样的问题相当长的一段时间。
一个好处是,使用代码设置配置 - 您可以创建任何你想要的方式,以及任何数量的配置变量/数组/对象;它非常灵活。
但是,它确实鼓励将变量放在本质上是全局范围内,这对于未来的可维护性来说不是一个好主意。
此外,由于这是代码,因此如果预计非编码器在任何时候都会更改配置,则不合适。它有效,但不是很好。
在运行时更改配置也很困难,然后再次写出文件。与其他一些选项相比,这基本上是只读的。
然而,这是如此普遍,它实际上是在PHP文档中给出的函数include
第一个例子:http://php.net/manual/en/function.include.php
“包括”返回的配置
这项技术的另一个PHP文件几乎与上面相同,但它解决了引入全局范围的问题。
不是配置一系列变量,而是设置返回到包含脚本的局部变量。
database_configuration.php
<?
return array('host' => 'myhost'
, 'username' => 'myuser'
, 'password' => 'mypassword'
, 'database' => 'mydatabase');
用法:
<?
$dbConfig = include('database_configuration.php');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
几乎相同的考虑第一个例子中需要加以考虑。
它是PHP,所以它非常灵活,但交给非编码器也是非常危险的。
你无法绕过它 - 你可能已经将配置移动到另一个文件中,但严格来说它仍然是'硬编码'。
这也包括为include
文档中,如例5:http://php.net/manual/en/function.include.php
注意,以上的解决方案还可以使用require
:http://php.net/manual/en/function.require.php
这通常是可取的,因为你会得到一个如果无法找到文件,则编译错误。
使用一个ini
文件
PHP具有内置的处理ini
文件的功能。最有用的可能是parse_ini_file
:http://php.net/manual/en/function.parse-ini-file.php
这允许您以标准格式创建ini文件并使用它来填充数组。
E.g.
database_configuration.ini
[database]
host=myhost
username=myusername
password=mypassword
database=mydatabase
用法:
<?
$dbConfig = parse_ini_file('database_configuration.ini');
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
或者,如果你想利用这些部分的文件中:
<?
$dbConfig = parse_ini_file('database_configuration.ini', true);
$connection = new mysqli($dbConfig['database']['host'] , $dbConfig['database']['username']
, $dbConfig['database']['password'], $dbConfig['database']['database']);
这样做的好处阅读起来更简单,因此保持。这不是PHP代码,因此非代码管理更容易。您仍然需要有人访问Web服务器上的文件系统,但至少他们不能编写任意PHP。
缺点是它只能真正处理原始类型。您可以配置数组,但不能创建对象(比如自己设置数据库连接)。
最后,像上面列出的其他例子一样,它基本上是单向的。您无法以编程方式更改内容并存储结果,而无需以ini
文件格式输出要输出的内容。
所有说,虽然做了,它的配置,因此不是“硬编码”/
使用存储在文件中的序列化格式
有,你可以用它来生成其他格式更复杂的对象,并且可以在运行时更容易地生成。
一个例子是简单对serialize
/unserialize
:
例如:http://php.net/manual/en/function.serialize.php
你会通过配置一个变量,然后输出一个文件产生一输出
<?
$configuration = array('host' => 'myhost'
, 'username' => 'myuser'
, 'password' => 'mypassword'
, 'database' => 'mydatabase');
file_put_contents('database_configuration.txt', serialize($configuration));
用法:
$dbConfig = unserialize(file_get_contents('database_configuration.txt'));
$connection = new mysqli($dbConfig['host'] , $dbConfig['username']
, $dbConfig['password'], $dbConfig['database']);
结果是一个文件,该文件几乎是不可读给最终用户,但它可以很容易被重新产生。例如,这将使您可以轻松创建管理员屏幕,从而允许在不访问文件系统的情况下设置此类配置。
PHP支持多种不同的格式,比其他格式更具人性化。
Conclusio n
有很多不同的选项,选择取决于存储的数据/配置的类型,谁可能会更改配置以及发生的频率。
我的建议是,无论选择哪个选项,您都会将其隐藏在课程后面,以便您可以根据需求更改来更改机制。
线沿线的东西:
$sUsername = ConfigurationManager::getConfig('database', 'username');
如果你有内容很多,你要存储我强烈建议你看看一个标准的CMS框架(Drupal的是,Joomla等) ,或者至少考虑一个数据库...
我应该参考这个问题和答案(特别是杰克的),让我想写一个(希望)规范问题。 http://stackoverflow.com/questions/27249766/storing-page-properties-without-database/27249913#27249913 – 2014-12-03 10:09:05
我是一个尽可能简单的朋友,在这种情况下,你不想改变这些值,而不是一个简单的大型数组文件完全做好这份工作。这确实不是很专业,但对于快速项目来说:为什么不呢? – Sliq 2014-12-03 10:43:56