I've been looking around the official php documentation but I'm unable to find what I'm looking for.
我一直在查看官方的php文档,但是我找不到我要找的东西。
http://php.net/manual/en/function.parse-ini-file.php
http://php.net/manual/en/function.parse-ini-file.php
I just want a function to edit and read the value from the php ini file, for instance,
我只是想要一个函数来编辑和读取php ini文件中的值,
[default_colors]
sitebg = #F8F8F8
footerbg = #F8F8F8
link = #F8F8F8
url = #F8F8F8
bg = #F8F8F8
text = #F8F8F8
border = #F8F8F8
lu_link = #F8F8F8
lu_url = #F8F8F8
lu_bg = #F8F8F8
lu_text = #f505f5
lu_border = #F8F8F8
- How do I read the value belonging to "lu_link" or "footerbg"?
- 我如何读取属于“lu_link”或“footerbg”的值?
- How to I write a new value for these places?
- 如何为这些地方写一个新的值?
6 个解决方案
#1
11
The PEAR Config_Lite package can do almost all the work (both reading and writing) for you super-easily. Check it out here: http://pear.php.net/package/Config_Lite
PEAR Config_Lite包可以超级轻松地完成几乎所有的工作(读和写)。看看这里:http://pear.php.net/package/Config_Lite
#2
49
You can simply use parse_ini_file
with PHP4/5.
您可以使用PHP4/5简单地使用parse_ini_file。
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);
Here is the doc: http://php.net/manual/en/function.parse-ini-file.php
下面是doc: http://php.net/manual/en/function.parse-ini-file.php
To write back an array of objects back to the ini file, use below as a very fast & easy solution:
要将一个对象数组写回ini文件,请使用下面的快速简单的解决方案:
function write_php_ini($array, $file)
{
$res = array();
foreach($array as $key => $val)
{
if(is_array($val))
{
$res[] = "[$key]";
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
}
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
}
safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave)
{ if ($fp = fopen($fileName, 'w'))
{
$startTime = microtime(TRUE);
do
{ $canWrite = flock($fp, LOCK_EX);
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
if(!$canWrite) usleep(round(rand(0, 100)*1000));
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));
//file was locked so now we can store information
if ($canWrite)
{ fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fclose($fp);
}
}
#3
5
How about this:
这个怎么样:
$key='option';
$val='1.2.3.4.5';
system("sed -ie 's/\({$key}=\)\(.*\)/\1{$val}/' file.in");
#4
1
Below is an implementation of write_ini_file()
which PHP is currently lacking, it will create an almost identical (except comments) of the input:
下面是write_ini_file()的实现,这是PHP目前所缺少的,它将创建一个几乎相同的输入(除了注释):
- Supports cross platform (
PHP_EOL
) new lines added between sections. - 支持跨平台(PHP_EOL)之间添加的新行。
- Handles both index and key value arrays.
- 处理索引和键值数组。
- Handles CONSTANT style values.
- 处理常数风格值。
- And file locking to stay consistent.
- 和文件锁定保持一致。
Source
源
<?php
if (!function_exists('write_ini_file')) {
/**
* Write an ini configuration file
*
* @param string $file
* @param array $array
* @return bool
*/
function write_ini_file($file, $array = []) {
// check first argument is string
if (!is_string($file)) {
throw new \InvalidArgumentException('Function argument 1 must be a string.');
}
// check second argument is array
if (!is_array($array)) {
throw new \InvalidArgumentException('Function argument 2 must be an array.');
}
// process array
$data = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$data[] = "[$key]";
foreach ($val as $skey => $sval) {
if (is_array($sval)) {
foreach ($sval as $_skey => $_sval) {
if (is_numeric($_skey)) {
$data[] = $skey.'[] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
} else {
$data[] = $skey.'['.$_skey.'] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
}
}
} else {
$data[] = $skey.' = '.(is_numeric($sval) ? $sval : (ctype_upper($sval) ? $sval : '"'.$sval.'"'));
}
}
} else {
$data[] = $key.' = '.(is_numeric($val) ? $val : (ctype_upper($val) ? $val : '"'.$val.'"'));
}
// empty line
$data[] = null;
}
// open file pointer, init flock options
$fp = fopen($file, 'w');
$retries = 0;
$max_retries = 100;
if (!$fp) {
return false;
}
// loop until get lock, or reach max retries
do {
if ($retries > 0) {
usleep(rand(1, 5000));
}
$retries += 1;
} while (!flock($fp, LOCK_EX) && $retries <= $max_retries);
// couldn't get the lock
if ($retries == $max_retries) {
return false;
}
// got lock, write data
fwrite($fp, implode(PHP_EOL, $data).PHP_EOL);
// release lock
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
}
Example input .ini
file (taken from http://php.net/manual/en/function.parse-ini-file.php)
示例输入.ini文件(取自http://php.net/manual/en/function.parse-ini-file.php)
; This is a sample configuration file
; Comments start with ';', as in php.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"
urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"
Example usage:
使用示例:
// load ini file values into array
$config = parse_ini_file('config.ini', true);
// add some additional values
$config['main']['foobar'] = 'baz';
$config['main']['const']['a'] = 'UPPERCASE';
$config['main']['const']['b'] = 'UPPER_CASE WITH SPACE';
$config['main']['array'][] = 'Some Value';
$config['main']['array'][] = 'ADD';
$config['third_section']['urls']['docs'] = 'http://php.net';
// write ini file
write_ini_file('config.ini', $config);
Resulting .ini
file:
生成的. ini文件:
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = 5.0
phpversion[] = 5.1
phpversion[] = 5.2
phpversion[] = 5.3
urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"
urls[docs] = "http://php.net"
[main]
foobar = "baz"
const[a] = UPPERCASE
const[b] = "UPPER_CASE WITH SPACE"
array[] = "Some Value"
array[] = ADD
#5
0
Here's a functional version that creates a string that can be written to a file.
这里有一个功能版本,它创建一个可以写入文件的字符串。
function IniAsStr(array $a) : string
{
return array_reduce(array_keys($a), function($str, $sectionName) use ($a) {
$sub = $a[$sectionName];
return $str . "[$sectionName]" . PHP_EOL .
array_reduce(array_keys($sub), function($str, $key) use($sub) {
return $str . $key . '=' . $sub[$key] . PHP_EOL;
}) . PHP_EOL;
});
}
#6
-14
You can simply use ini_set('lu_link','#000000');
or ini_get('lu_link')
.
您可以简单地使用ini_set('lu_link','#000000');或ini_get(“lu_link”)。
I feel, if you have limited PHP experience, it's not good to mess with the .ini
file.
我认为,如果您有有限的PHP经验,那么最好不要打乱.ini文件。
#1
11
The PEAR Config_Lite package can do almost all the work (both reading and writing) for you super-easily. Check it out here: http://pear.php.net/package/Config_Lite
PEAR Config_Lite包可以超级轻松地完成几乎所有的工作(读和写)。看看这里:http://pear.php.net/package/Config_Lite
#2
49
You can simply use parse_ini_file
with PHP4/5.
您可以使用PHP4/5简单地使用parse_ini_file。
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);
Here is the doc: http://php.net/manual/en/function.parse-ini-file.php
下面是doc: http://php.net/manual/en/function.parse-ini-file.php
To write back an array of objects back to the ini file, use below as a very fast & easy solution:
要将一个对象数组写回ini文件,请使用下面的快速简单的解决方案:
function write_php_ini($array, $file)
{
$res = array();
foreach($array as $key => $val)
{
if(is_array($val))
{
$res[] = "[$key]";
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
}
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
}
safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave)
{ if ($fp = fopen($fileName, 'w'))
{
$startTime = microtime(TRUE);
do
{ $canWrite = flock($fp, LOCK_EX);
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
if(!$canWrite) usleep(round(rand(0, 100)*1000));
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));
//file was locked so now we can store information
if ($canWrite)
{ fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fclose($fp);
}
}
#3
5
How about this:
这个怎么样:
$key='option';
$val='1.2.3.4.5';
system("sed -ie 's/\({$key}=\)\(.*\)/\1{$val}/' file.in");
#4
1
Below is an implementation of write_ini_file()
which PHP is currently lacking, it will create an almost identical (except comments) of the input:
下面是write_ini_file()的实现,这是PHP目前所缺少的,它将创建一个几乎相同的输入(除了注释):
- Supports cross platform (
PHP_EOL
) new lines added between sections. - 支持跨平台(PHP_EOL)之间添加的新行。
- Handles both index and key value arrays.
- 处理索引和键值数组。
- Handles CONSTANT style values.
- 处理常数风格值。
- And file locking to stay consistent.
- 和文件锁定保持一致。
Source
源
<?php
if (!function_exists('write_ini_file')) {
/**
* Write an ini configuration file
*
* @param string $file
* @param array $array
* @return bool
*/
function write_ini_file($file, $array = []) {
// check first argument is string
if (!is_string($file)) {
throw new \InvalidArgumentException('Function argument 1 must be a string.');
}
// check second argument is array
if (!is_array($array)) {
throw new \InvalidArgumentException('Function argument 2 must be an array.');
}
// process array
$data = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$data[] = "[$key]";
foreach ($val as $skey => $sval) {
if (is_array($sval)) {
foreach ($sval as $_skey => $_sval) {
if (is_numeric($_skey)) {
$data[] = $skey.'[] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
} else {
$data[] = $skey.'['.$_skey.'] = '.(is_numeric($_sval) ? $_sval : (ctype_upper($_sval) ? $_sval : '"'.$_sval.'"'));
}
}
} else {
$data[] = $skey.' = '.(is_numeric($sval) ? $sval : (ctype_upper($sval) ? $sval : '"'.$sval.'"'));
}
}
} else {
$data[] = $key.' = '.(is_numeric($val) ? $val : (ctype_upper($val) ? $val : '"'.$val.'"'));
}
// empty line
$data[] = null;
}
// open file pointer, init flock options
$fp = fopen($file, 'w');
$retries = 0;
$max_retries = 100;
if (!$fp) {
return false;
}
// loop until get lock, or reach max retries
do {
if ($retries > 0) {
usleep(rand(1, 5000));
}
$retries += 1;
} while (!flock($fp, LOCK_EX) && $retries <= $max_retries);
// couldn't get the lock
if ($retries == $max_retries) {
return false;
}
// got lock, write data
fwrite($fp, implode(PHP_EOL, $data).PHP_EOL);
// release lock
flock($fp, LOCK_UN);
fclose($fp);
return true;
}
}
Example input .ini
file (taken from http://php.net/manual/en/function.parse-ini-file.php)
示例输入.ini文件(取自http://php.net/manual/en/function.parse-ini-file.php)
; This is a sample configuration file
; Comments start with ';', as in php.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"
urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"
Example usage:
使用示例:
// load ini file values into array
$config = parse_ini_file('config.ini', true);
// add some additional values
$config['main']['foobar'] = 'baz';
$config['main']['const']['a'] = 'UPPERCASE';
$config['main']['const']['b'] = 'UPPER_CASE WITH SPACE';
$config['main']['array'][] = 'Some Value';
$config['main']['array'][] = 'ADD';
$config['third_section']['urls']['docs'] = 'http://php.net';
// write ini file
write_ini_file('config.ini', $config);
Resulting .ini
file:
生成的. ini文件:
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = 5.0
phpversion[] = 5.1
phpversion[] = 5.2
phpversion[] = 5.3
urls[svn] = "http://svn.php.net"
urls[git] = "http://git.php.net"
urls[docs] = "http://php.net"
[main]
foobar = "baz"
const[a] = UPPERCASE
const[b] = "UPPER_CASE WITH SPACE"
array[] = "Some Value"
array[] = ADD
#5
0
Here's a functional version that creates a string that can be written to a file.
这里有一个功能版本,它创建一个可以写入文件的字符串。
function IniAsStr(array $a) : string
{
return array_reduce(array_keys($a), function($str, $sectionName) use ($a) {
$sub = $a[$sectionName];
return $str . "[$sectionName]" . PHP_EOL .
array_reduce(array_keys($sub), function($str, $key) use($sub) {
return $str . $key . '=' . $sub[$key] . PHP_EOL;
}) . PHP_EOL;
});
}
#6
-14
You can simply use ini_set('lu_link','#000000');
or ini_get('lu_link')
.
您可以简单地使用ini_set('lu_link','#000000');或ini_get(“lu_link”)。
I feel, if you have limited PHP experience, it's not good to mess with the .ini
file.
我认为,如果您有有限的PHP经验,那么最好不要打乱.ini文件。