我有一个用标准PHP(没有框架或CMS)编写的网站,我有一些可以配置的信息,我想要存储,我要么不想要,要么可以& #39; t将它们存储在数据库中。
有:
我知道我可以"硬编码"这样的事情,但我想把它们放在一个严格意义上不是文件的文件中。#34;代码"。
存储哪些选项适用于哪些?
答案 0 :(得分:2)
在相当标准的PHP中有很多选项,选择主要取决于存储的信息类型以及编辑它的人。
<强>&#34;包含&#34;另一个设置变量的PHP文件
您可以使用include
或require
关键字来包含设置一系列变量的文件,然后可以在该文件之外引用这些变量。
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']);
这是一所非常古老的学校&#39;并且是很多人在很长一段时间内会遇到这种问题的方式。
优点是使用代码设置配置 - 您可以通过这种方式创建任何您想要的任何内容,以及任意数量的配置变量/数组/对象;它非常灵活。
但是,确实鼓励将变量放在本质上是全局范围内,这对于未来的可维护性来说不是一个好主意。
此外,由于这是代码,如果期望非编码器在任何时候改变配置,则是不合适的。它有效,但并不好。
在运行时更改配置并再次写出文件也很困难。与其他一些选项相比,这使它基本上是只读的。
然而,这是无处不在,它实际上是关于函数include
的PHP文档中给出的第一个示例:http://php.net/manual/en/function.include.php
<强>&#34;包含&#34;另一个返回配置的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
文件格式输出内容。
所有的说法和完成,但它是配置,所以不是&#39;硬编码&#39; /
使用存储在文件中的序列化格式
您可以使用其他格式生成更复杂的对象,并且可以在运行时更轻松地生成这些格式。
示例是简单的一对serialize
/ unserialize
:http://php.net/manual/en/function.serialize.php
您可以通过配置变量然后输出文件来生成输出:
E.g。
<?
$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支持不同的格式,有些格式比其他格式更具人性化。
<强>结论强>
有许多不同的选项,选择取决于存储的数据/配置的类型,谁可能更改配置以及可能发生的频率。
我的建议是,无论选择哪个选项,您都会将其隐藏在课程后面,以便您可以在需求发生变化时更改机制。
有些事情:
$sUsername = ConfigurationManager::getConfig( 'database', 'username' );
如果您有大量内容存储,我强烈建议您查看标准CMS框架(Drupal,Joomla等),或者至少考虑一个数据库。 ..