example - Cómo leer y escribir en un archivo ini con PHP
php.ini wordpress (6)
He estado buscando en la documentación oficial de php, pero no puedo encontrar lo que estoy buscando.
http://php.net/manual/en/function.parse-ini-file.php
Solo quiero una función para editar y leer el valor del archivo php ini, por ejemplo,
[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
- ¿Cómo leo el valor que pertenece a "lu_link" o "footerbg"?
- ¿Cómo escribo un nuevo valor para estos lugares?
A continuación se muestra una implementación de write_ini_file()
que actualmente PHP carece, se creará una casi idéntica (excepto los comentarios) de la entrada:
- Admite líneas nuevas multiplataforma (
PHP_EOL
) agregadas entre secciones. - Maneja arreglos de valores de índice y clave.
- Maneja valores de estilo CONSTANTE.
- Y bloqueo de archivos para mantenerse consistente.
Fuente
<?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;
}
}
Ejemplo de archivo .ini
entrada (tomado de 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"
Ejemplo de uso:
// 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);
Archivo .ini
resultante:
[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
Aquí hay una versión funcional que crea una cadena que se puede escribir en un archivo.
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;
});
}
El paquete PEAR Config_Lite puede hacer casi todo el trabajo (tanto de lectura como de escritura) para usted de manera súper fácil. Compruébelo aquí: http://pear.php.net/package/Config_Lite
Qué tal esto:
$key=''option'';
$val=''1.2.3.4.5'';
system("sed -ie ''s//({$key}=/)/(.*/)//1{$val}/'' file.in");
Simplemente puede usar ini_set(''lu_link'',''#000000'');
o ini_get(''lu_link'')
.
Creo que si tienes experiencia limitada en PHP, no es bueno meterse con el archivo .ini
.
Simplemente puede usar parse_ini_file
con PHP4 / 5.
$ini_array = parse_ini_file("sample.ini");
print_r($ini_array);
Aquí está el documento: http://php.net/manual/en/function.parse-ini-file.php
Para volver a escribir una matriz de objetos en el archivo ini, utilice a continuación como una solución muy rápida y fácil:
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);
}
}