本文舉例說明了創建可配置 PHP 應用程序的幾種方法。文中也探討了應用程序中理想的配置點,並在應用程序過分可配置和過分封閉之間尋求一個平衡點。
假如計劃讓其他人或公司可以使用您的 PHP 應用程序,需要確保該程序是可配置的。至少,要答應用戶以一種安全的方式設置數據庫登錄及密碼,從而使其中的材料不會對外公開。
本文展示了幾種用於存儲配置設置及編輯這些設置的技術。另外,文中也為哪些元素需要設為可配置以及如何避免陷入配置過度或者配置不足的困境提供了指導。
使用 INI 文件進行配置
PHP 內建了對配置文件的支持。這是通過 php.ini 文件這樣的初始化文件(INI)機制實現的,在 php.ini 文件中定義了數據庫連接超時或會話如何存儲等常量。假如願意的話,可以在這個 php.ini 文件中為應用程序定制配置。為了說明,我將下列代碼行添加到 php.ini 文件中。
myapptempdir=foo
然後,我編寫了一個小 PHP 腳本來讀取這個配置項,如清單 1 所示。
清單 1. ini1.php
<?php
function get_template_directory()
{
$v = get_cfg_var( "myapptempdir" );
return ( $v == null ) ? "tempdir" : $v;
}
echo( get_template_directory()."n" );
?>
當在命令行中運行這段代碼時,得到如下結果:
% php ini1.php
foo
%
太棒了。但為什麼不能用標准的 INI 函數來獲取 myapptempdir 配置項的值呢?我研究了一下,發現在大多數情況下,定制配置項不能使用這些方法來獲取。然而,使用 get_cfg_var 函數卻是可以訪問的。
為使這個方法更加簡單,將對變量的訪問封裝在第二個函數中,該函數使用配置鍵名及一個缺省值作為參數,如下所示。
清單 2. ini2.php
function get_ini_value( $n, $dv )
{
$c = get_cfg_var( $n );
return ( $c == null ) ? $dv : $c;
}
function get_template_directory()
{
return get_ini_value( "myapptempdir", "tempdir" );
}
這是對如何訪問 INI 文件的一個很好的概括,所以,假如要使用一個不同的機制或將這個 INI 文件存儲到其他位置,就不需要為更改大量的函數而大費周折。
我不推薦使用 INI 文件作為應用程序的配置,這有兩個理由。首先,雖然這樣做較輕易讀取 INI 文件,但卻幾乎不可能安全地寫 INI 文件。所以這樣做只適合於只讀配置項。第二,php.ini 文件在服務器的所有應用程序上共享,所以我認為特定於應用程序的配置項不應該寫在該文件中。
需要對 INI 文件了解什麼呢?最重要的是如何重置 include 路徑來添加配置項,如下所示。
清單 3. ini3.php
<?php
echo( ini_get("include_path")."n" );
ini_set("include_path",
ini_get("include_path").":./mylib" );
echo( ini_get("include_path")."n" );
?>
在本例中,我將我的本地 mylib 目錄添加到了 include 路徑中,所以能夠從該目錄中 require PHP 文件,而不需要將該路徑添加到 require 語句中。
PHP 中的配置
通常對於在 INI 文件中存儲配置條目的一個替代辦法是使用一個簡單的 PHP 腳本來保持數據。如下是一個樣例。
清單 4. config.php
<?php
# Specify the location of the temporary directory
#
$TEMPLATE_DIRECTORY = "tempdir";
?>
使用該常量的代碼如下所示。