9core.com - 九核技术交流网

九百链
为了更好的解决实际工作中遇到的问题,本站开设了QQ群 ASP+PHP+JSP+.NET①:9793624
ASP+PHP+JSP+.NET②:17775294
网站通告: 新开设QQ群,群号:17775294 九核WEB技术专业论坛 官方QQ群 9793624
搜索: 您的位置主页> 程序开发 > Php技术 >阅读资讯: 构建可配置PHP应用程序的正确方式

构建可配置PHP应用程序的正确方式

文章来源:互联网 发表时间:2008-09-09 点击次数

本文举例说明了创建可配置PHP应用程序的几种方法。文中也探讨了应用程序中理想的配置点,并在应用程序过分可配置和过分封闭之间寻求一个平衡点。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

如果计划让其他人或公司可以使用您的PHP应用程序,需要确保该程序是可配置的。至少,要允许用户以一种安全的方式设置数据库登录及密码,从而使其中的材料不会对外公开。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

本文展示了几种用于存储配置设置及编辑这些设置的技术。另外,文中也为哪些元素需要设为可配置以及如何避免陷入配置过度或者配置不足的困境提供了指导。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

使用INI文件进行配置

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

PHP内建了对配置文件的支持。这是通过php.ini文件这样的初始化文件(INI)机制实现的,在php.ini文件中定义了数据库连接超时或会话如何存储等常量。如果愿意的话,可以在这个php.ini文件中为应用程序定制配置。为了说明,我将下列代码行添加到php.ini文件中。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

myapptempdir=foo

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

然后,我编写了一个小PHP脚本来读取这个配置项,如清单1所示。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

清单1.ini1.php

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj 


<?php
functionget_template_directory()
{
 $v=get_cfg_var("myapptempdir");
 return($v==null)?"tempdir":$v;
}

echo(get_template_directory()."\n");
?>

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

当在命令行中运行这段代码时,得到如下结果:

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

 


%phpini1.php
foo
%

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

太棒了。但为什么不能用标准的INI函数来获取myapptempdir配置项的值呢?我研究了一下,发现在大多数情况下,定制配置项不能使用这些方法来获取。然而,使用get_cfg_var函数却是可以访问的。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

为使这个方法更加简单,将对变量的访问封装在第二个函数中,该函数使用配置键名及一个缺省值作为参数,如下所示。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

清单2.ini2.php

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj 


functionget_ini_value($n,$dv)
{
 $c=get_cfg_var($n);
 return($c==null)?$dv:$c;
}

functionget_template_directory()
{
 returnget_ini_value("myapptempdir","tempdir");
}

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

这是对如何访问INI文件的一个很好的概括,所以,如果要使用一个不同的机制或将这个INI文件存储到其他位置,就不需要为更改大量的函数而大费周折。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

我不推荐使用INI文件作为应用程序的配置,这有两个理由。首先,虽然这样做较容易读取INI文件,但却几乎不可能安全地写INI文件。所以这样做只适合于只读配置项。第二,php.ini文件在服务器的所有应用程序上共享,所以我认为特定于应用程序的配置项不应该写在该文件中。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

需要对INI文件了解什么呢?最重要的是如何重置include路径来添加配置项,如下所示。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

清单3.ini3.php

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj 


<?php
echo(ini_get("include_path")."\n");
ini_set("include_path",
ini_get("include_path").":./mylib");
echo(ini_get("include_path")."\n");
?>

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

在本例中,我将我的本地mylib目录添加到了include路径中,所以能够从该目录中requirePHP文件,而不需要将该路径添加到require语句中。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

PHP中的配置

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

通常对于在INI文件中存储配置条目的一个替代办法是使用一个简单的PHP脚本来保持数据。如下是一个样例。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

清单4.config.php

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

 


<?php
#Specifythelocationofthetemporarydirectory
#
$TEMPLATE_DIRECTORY="tempdir";
?>

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

使用该常量的代码如下所示。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

清单5.php.php

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj 


<?php
require_once'config.php';

functionget_template_directory()
{
 global$TEMPLATE_DIRECTORY;
 return$TEMPLATE_DIRECTORY;
}

echo(get_template_directory()."\n");
?>

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

该代码首先包含配置文件(config.php),接着就可以直接使用这些常量了。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

使用这项技术有很多优势。首先,如果某些人仅仅浏览config.php文件,该页面是空白的。所以可以将config.php放到相同的文件中,并作为Web应用程序的根。第二,在任何编辑器中都可编辑,并且在一些编辑器中甚至具备语法着色及语法检查功能。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

这项技术的缺点是,这是一个像INI文件一样的只读技术。将数据从此文件中提取出来是轻而易举的,但在该PHP文件中调整数据却很困难,在一些情况下甚至是不可能的。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

下面的替代方法显示了如何编写在本质上既可读又可写的配置系统。

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj

 

Cdhw88LB6WNAw0nhksuh3UR3v2FttbyQY2pDEsKj
Php
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助