PHP PEAR::Config管理配置信息
Config类可以熟练地管理你的配置文件,不论它是存放在XML文件,INI文件,PHP数组或其它的数据资源中,它有以下的特性:
1.解析不同的数据格式;
2.可以熟练地处理你所使用的sections, directives, comments, blanks
3.将配置信息重新保存到你所喜欢的格式中(XML文件,INI文件,PHP数组或其它的数据资源).
最顶层对象Config_Container
它的结构:
Section:Section下面还可以包括Config_Container对象;
Directive:不包含其它的对象,但有一对类似于key-value形式的数据;
Comment:
Blank:
可以设置的数据格式为:
xml
phparray
inifile
Apache conf(.conf)
假设我们要将员工的信息保存为如下形式
<?xml version="1.0" encoding="UTF-8"?>
<Company>
<Member>
<name>jxyuhua</name>
<email>jxyuhua at yahoo.com.cn</email>
<www>http://www.b2c-battery.co.uk/</www>
</Member>
</Company>
下面开始建立它
<?php
require_once('Config.php');
$conf['storage']['driver'] = 'sql';
$conf['storage']['params']['phptype'] = 'mysql';
$conf['storage']['params']['hostspec'] = 'localhost';
$conf['storage']['params']['username'] = 'mamasam';
$conf['storage']['params']['password'] = 'foobar';
$conf['Menu']['Laptop'] = array('ibm'=>'IBM', 'sony'=>'SONY');
$conf['Website']['UK']['b2c-battery'] = 'http://www.b2c-battery.co.uk';
$conf['Website']['UK']['global-batteries'] = 'http://www.global-batteries.co.uk';
$c = new Config();
$root =& $c->parseConfig($conf, 'phparray');
$storage =& $root->getItem('section', 'storage');
//先删除,然后增加,改变它出现的顺序
$storage->removeItem();
$root->addItem($storage);
//echo '<pre>'. htmlspecialchars($root->toString('xml', array('name' => 'Company'))) .'</pre>';
if ($c->writeConfig('D:/tmp/config.xml', 'xml', array('name' => 'Company')) === true) {
echo 'Config written into D:/tmp/config.xml';
}
?>
读取配置文件
<?php
require_once("Config.php");
$c = new Config();
$root = & $c->parseConfig("D:/tmp/member.xml", "xml");
//你也可以从其它地方读取配置信息如:
/**
$conf = array('DB' => array('type' => 'mysql',
'host' => 'localhost',
'user' => 'user',
'pass' => 'pass')
);
$root =& $c->parseConfig($conf, 'phparray', array('name' => 'conf'));
*/
if (PEAR::isError($root)) {
die('Error while reading configuration: ' . $root->getMessage());
}
$settings = $root->toArray();
printf('User settings: <a href="%s">%s %s</a>',
$settings['root']['Company']['Member']['www'],
$settings['root']['Company']['Member']['name'],
$settings['root']['Company']['Member']['email']
);
?>
下面来个复杂,实用一些的:
有如下的一个配置文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<Company>
<Menu>
<Laptop>
<ibm>IBM</ibm>
<sony>SONY</sony>
</Laptop>
</Menu>
<Website>
<UK>
<b2c-battery>http://www.b2c-battery.co.uk</b2c-battery>
<global-batteries>http://www.global-batteries.co.uk</global-batteries>
</UK>
</Website>
<storage>
<driver>sql</driver>
<params>
<phptype>mysql</phptype>
<hostspec>localhost</hostspec>
<username>mamasam</username>
<password>foobar</password>
</params>
</storage>
</Company>
首先,我们先将它保存进xml文件中:
//write.php
<?php
require_once('Config.php');
$conf['storage']['driver'] = 'sql';
$conf['storage']['params']['phptype'] = 'mysql';
$conf['storage']['params']['hostspec'] = 'localhost';
$conf['storage']['params']['username'] = 'mamasam';
$conf['storage']['params']['password'] = 'foobar';
$conf['Menu']['Laptop'] = array('ibm'=>'IBM', 'sony'=>'SONY');
$conf['Website']['UK']['b2c-battery'] = 'http://www.b2c-battery.co.uk';
$conf['Website']['UK']['global-batteries'] = 'http://www.global-batteries.co.uk';
$c = new Config();
$root =& $c->parseConfig($conf, 'phparray');
$storage =& $root->getItem('section', 'storage');
//先删除,然后增加,改变它出现的顺序
$storage->removeItem();
$root->addItem($storage);
//echo '<pre>'. htmlspecialchars($root->toString('xml', array('name' => 'Company'))) .'</pre>';
if ($c->writeConfig('D:/tmp/config.xml', 'xml', array('name' => 'Company')) === true) {
echo 'Config written into D:/tmp/config.xml';
}
?>好了,接下来就是读取这个配置文件了,假设我们只需要数据库配置这段内容<storage>
//read.php
<?php
require_once('Config.php');
$c = new Config();
$root = & $c->parseConfig('D:/tmp/config.xml', 'xml');
if(PEAR::isError($root)) {
die($root->getMessage());
}
//读取指定选区的信息
//我这样读不行,不知道是不是Config的问题,但对一个简单的XML结构的文件是可以的,稍后会附上例子
//$storage =& $root->getItem('section', 'storage');
//因为以上的代码不行,所以只好用一个笨办法,这样对大数据量的文件来说,效率不高。
//你是不是有好的解决办法呢?不妨告诉我一下。
$content = $root->toArray();
unset($root);
$storage = $content['root']['Company']['storage'];
unset($content);
echo('<pre>');
print_r($storage);
echo('</pre>');
//这样你就得到了一个PHP数组了,其它的操作就看你自己了。
?>
一个可以用getItem()读取的例子,它的数据结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<mysql>
<host>localhost</host>
<user>joe</user>
<pass>secret</pass>
<db>db456</db>
</mysql>
<?php
require_once("Config.php");
$c = new Config();
$root =& $c->parseConfig("mysql.xml", "XML");
$mysqlSection =& $root->getItem("section", "mysql");
$hostDirective =& $mysqlSection->getItem("directive", "host");
$userDirective =& $mysqlSection->getItem("directive", "user");
$passDirective =& $mysqlSection->getItem("directive", "pass");
$dbDirective =& $mysqlSection->getItem("directive", "db");
$user = $userDirective->getContent();
echo($user);
?>