<?php
ini_set("display_errors", 1);
ini_set('date.timezone', 'Asia/Shanghai');
header('Content-Type:text/html;charset=utf-8');
class Ini
{
private $iniContent = array(); //格式化键后的INI内容 key转化成大写
private $fileContentString = '';
private $originalIniContent = array(); //原始文件中的INI内容
private $filename = '';
public function __construct($filename=null)
{
$this->filename = $filename;
$this->setIniContent();
}
/**
*
* 初始化Ini文件数组
*/
private function setIniContent()
{
if (!is_file($this->filename)) {
return '没有初始化文件';
}
$this->fileContentString = file_get_contents($this->filename);
$this->originalIniContent = parse_ini_file($this->filename, true);
foreach ($this->originalIniContent as $key => $value) {
$upperKey = strtoupper($key);
if (is_array($value)) {
foreach ($value as $k => $v) {
$arrKey = strtoupper($k);
$this->iniContent[$upperKey][$arrKey] = $v;
}
} else {
$this->iniContent["$upperKey"] = $value;
}
}
}
/**
* 获得INI文件的整体信息
*/
public function getIniContent()
{
return $this->originalIniContent;
}
/**
* 根据节点名和键名,获得该节点下该键名的值
* @param string $keyName 键名
* @param string $nodeName 节点名 可以不传
* @return string 键值
*/
public function getIniValue($keyName, $nodeName = null)
{
if (!is_file($this->filename)) {
return false;
}
$keyName = strtoupper($keyName);
$nodeName = $nodeName ? strtoupper($nodeName) : null;
if (is_null($nodeName) && array_key_exists($keyName, $this->iniContent)) {
return $this->iniContent[$keyName];
}
return $this->iniContent[$nodeName][$keyName];
}
/**
* 设置新的健值对
* @param $keyName 键名
* @param $value 值
* @param $nodeName 节点名
* @return bool
*/
public function setIniValue($keyName, $value, $nodeName = null)
{
if (!is_file($this->filename)) {
return '没有初始化文件';
}
$arrKey = $this->originalIniContent;
if (is_null($nodeName)) {
$arrKey[$keyName] = $value;
} else {
$arrKey[$nodeName][$keyName] = $value;
}
$strNewIniContent= $this->arrToIniStr($arrKey);
if (file_put_contents($this->filename, $strNewIniContent)) {
$this->setIniContent();
return true;
} else {
return false;
}
}
/**
* 根据数组,生成ini文件
* @param array $arr
* @param string $filename
* @return bool
*/
public function creatIniFileByArr(array $arr, $filename = null)
{
if (!is_null($filename)) {
$this->filename = $filename;
}
// 自动创建目录
$dir = dirname($this->filename);
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
}
$iniNewContent = $this->arrToIniStr($arr);
if (file_put_contents($this->filename, $iniNewContent)) {
$this->setIniContent();
return true;
} else {
return false;
}
}
/**
* 将数组转化成ini格式的字符串
* @param array $arr
* @return string
*/
private function arrToIniStr(array $arr)
{
$iniNewContent = '';
foreach ($arr as $k => $v) {
if (is_array($v)) {
$iniNewContent .= '[' . $k . ']' . "\r\n";
foreach ($v as $key => $value) {
$iniNewContent .= $key . '=' . $value . "\r\n";
}
} else {
$iniNewContent .= $k . '=' . $v . "\r\n";
}
}
return trim($iniNewContent);
}
}
$path = dirname(__FILE__) ;
$path = $path . '/test/config.ini';
$arr = array('redis' =>array('host'=>'192.068.0.1','port'=>'6739'), 'mysql' => array('host' => '192.168.0.1', 'port' => '3306'));
$myinit = new Ini($path);
var_dump($myinit->creatIniFileByArr($arr));//根据数组内容创建文件
var_dump($myinit->setIniValue('name','myname2','mysql'));//设置增加一个配制项
var_dump($myinit->getIniValue('name','mysql'));//读取一个配制项