Функция читает настройки конфигурационного файла php
parse_ini_file() загружает ini-файл, указанный в аргументе filename , и возвращает его настройки в виде ассоциативного массива.
Структура ini-файла похожа на структуру php.ini .
Список параметров
Имя обрабатываемого ini-файла.
Установив параметр process_sections в TRUE , вы получаете многомерный массив, который включает как название отдельных настроек, так и секции. По умолчанию process_sections равен FALSE
Может принимать следующие значения: INI_SCANNER_NORMAL (по умолчанию) или INI_SCANNER_RAW . Если указано значение INI_SCANNER_RAW , то значения опций не будут обрабатываться.
Возвращаемые значения
В случае успеха настройки возвращаются в виде ассоциативного array . В случае ошибки возвращается FALSE .
Список изменений
Примеры
Константы также могут обрабатываться в ini-файлах, так что если вы объявите константу в виде значения для ini-файла до вызова parse_ini_file() , то константа будет корректно обработана. Таким образом обрабатываются только значения опций. Например:
define ( 'BIRD' , 'Dodo bird' );
// Обрабатываем без секций
$ini_array = parse_ini_file ( "sample.ini" );
print_r ( $ini_array );
// Обрабатываем с секциями
$ini_array = parse_ini_file ( "sample.ini" , true );
print_r ( $ini_array );
Результатом выполнения данного примера будет что-то подобное:
// Простая функция для сравнения результатов
function yesno ( $expression )
return( $expression ? 'Yes' : 'No' );
>
// Получаем путь к php.ini с помощью функции php_ini_loaded_file()
// функция доступна начиная с версии PHP 5.2.4
$ini_path = php_ini_loaded_file ();
// Обрабатываем php.ini
$ini = parse_ini_file ( $ini_path );
// Выводим и сравниваем значения, учтите, что использование get_cfg_var()
// даст одинаковые результаты для используемых здесь значений parsed (загруженное из файла) и loaded (используемое в данный момент)
echo '(parsed) magic_quotes_gpc = ' . yesno ( $ini [ 'magic_quotes_gpc' ]) . PHP_EOL ;
echo '(loaded) magic_quotes_gpc = ' . yesno ( get_cfg_var ( 'magic_quotes_gpc' )) . PHP_EOL ;
?>
Результатом выполнения данного примера будет что-то подобное:
Примечания
Замечание:
Эта функция не имеет никакого отношения к файлу php.ini . К моменту выполнения вашего скрипта, он уже обработан. Эта функция может быть использована для загрузки настроек вашего собственного приложения.
Замечание:
Если значение в ini-файле содержит прочие символы, кроме букв и цифр, оно должно заключаться в двойные кавычки (").
Замечание: Существует зарезервированные слова, которые нельзя использовать в качестве ключей в ini-файлах. Такими словами являются: null, yes, no, true, false, on, off, none. Значения null, off, no и false преобразуются в "". Значения on, yes и true преобразуются в "1". Символы ?<>|&~![()^" не должны использоваться в ключах и иметь какой-либо особый смысл в значениях.
Замечание:
Записи без знака равенства игнорируются. Например, "foo" игнорируется, тогда как "bar =" обрабатывается и добавляется с пустым значением. Например, в MySQL есть опция "no-auto-rehash", устанавливаемая в my.cnf , которая не имеет значения и игнорируется.
В случае успешного выполнения возвращает значение настройки конфигурации.
Список параметров
Имя настройки конфигурации.
Возвращаемые значения
Возвращает значение настройки конфигурации в виде строки. Для значений null будет возвращаться пустая строка. Функция вернёт false , если указанная настройка не существует.
Примеры
/*
Наш файл php.ini содержит следующие настройки:
display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get ( 'display_errors' ) . "\n" ;
echo 'register_globals = ' . ini_get ( 'register_globals' ) . "\n" ;
echo 'post_max_size = ' . ini_get ( 'post_max_size' ) . "\n" ;
echo 'post_max_size+1 = ' . ( ini_get ( 'post_max_size' )+ 1 ) . "\n" ;
echo 'post_max_size in bytes = ' . return_bytes ( ini_get ( 'post_max_size' ));
function return_bytes ( $val ) $val = trim ( $val );
$last = strtolower ( $val [ strlen ( $val )- 1 ]);
switch( $last ) // Модификатор 'G' доступен
case 'g' :
$val *= 1024 ;
case 'm' :
$val *= 1024 ;
case 'k' :
$val *= 1024 ;
>
Результатом выполнения данного примера будет что-то подобное:
Примечания
Замечание: Возвращаемые логические значения
Boolean-значение ini-настройки off будет возвращено в виде пустой строки или строки "0", в то время как значению on будет соответствовать строка "1". Функция также может возвращать буквенные значения INI-настройки.
Замечание: Возвращаемые значения количества памяти
Многие ini-настройки, значения которых измеряются количеством памяти, такие как upload_max_filesize, сохраняются в php.ini в сокращённом виде. ini_get() вернёт именно то, что записано в файле php.ini , а НЕ целочисленный ( int ) эквивалент этой величины. Попытка использования полученной величины в арифметических операциях не даст желаемого результата. В приведённом выше примере продемонстрировано, как можно перевести сокращённую запись в число байт.
Замечание:
ini_get() не может прочесть опции типа "массив", такие как pdo.dsn.*, и возвращает false таких случаях.
Смотрите также
- get_cfg_var() - Извлекает значение настройки конфигурации PHP
- ini_get_all() - Получает все настройки конфигурации
- ini_restore() - Восстанавливает значение настройки конфигурации
- ini_set() - Устанавливает значение настройки конфигурации
User Contributed Notes 12 notes
function return_bytes ( $size_str )
switch ( substr ( $size_str , - 1 ))
case 'M' : case 'm' : return (int) $size_str * 1048576 ;
case 'K' : case 'k' : return (int) $size_str * 1024 ;
case 'G' : case 'g' : return (int) $size_str * 1073741824 ;
default: return $size_str ;
>
>
?>
Here is another way to get the result in bytes using PHP8
/**
* @param string $size
* @return int
* @author DevsrealmGuy
*/
public function getBytes ( string $size ): int
$size = trim ( $size );
$value = (isset( $matches [ 1 ])) ? $matches [ 1 ] : 0 ;
$metric = (isset( $matches [ 2 ])) ? strtolower ( $matches [ 2 ]) : 'b' ;
return (int) $value ;
>
Be aware that max_execution_time can be altered by XDebug.
While debugging a script locally that made use of it returned 0 when XDebug remote debugging was enabled and the IDE was listening to it.
It makes sense, since debugging manually takes time so we don't want the script to time out ; but in that particular case, it made it look to the script like max_execution_time was 0, so calculations were wrong.
You can see in phpinfo() that local value is 0 in that case, but master value is the correct one you set in your php.ini.
Concerning the value retourned, it depends on how you set it.
I had the problem with horde-3 which test the safe_mode value.
THan :
- if you set the value with php_admin_value safe_mode Off (or On) ini_get returns the string
- if you set the value with php_admin_flag safe_mode Off (or On) ini_get returns the boolean.
The above example function called return_bytes() assumes that ini_get('upload_max_filesize') delivers only one letter at the end. As I've seen 'Mb' and things like that, I'd suggest to change the $last = . part into $last = strtolower(substr($val,strlen($val/1),1)).
I'd call it $unit then.
This version of return_bytes takes care of the MB, GB, KB cases along with the M,G,K ones.
Hope this is helpful!
public static function return_bytes ( $val )
if(empty( $val ))return 0 ;
$last = '' ;
if(isset( $matches [ 2 ])) $last = $matches [ 2 ];
>
if(isset( $matches [ 1 ])) $val = (int) $matches [ 1 ];
>
switch ( strtolower ( $last ))
case 'g' :
case 'gb' :
$val *= 1024 ;
case 'm' :
case 'mb' :
$val *= 1024 ;
case 'k' :
case 'kb' :
$val *= 1024 ;
>
Here is a version combining a few of the examples here that does *not* require php8 nor does it generate a warning
/**
* gets the value in bytes converted from a human readable string like 10G'
*
* @param mixed $val the human readable/shorthand version of the value
* @return int the value converted to bytes
*/
function return_bytes($val) $val = trim($val);
preg_match('/(4+)[\s]*([a-zA-Z]+)/', $val, $matches);
$value = (isset($matches[1])) ? intval($matches[1]) : 0;
$metric = (isset($matches[2])) ? strtolower($matches[2]) : 'b';
switch ($metric) case 'tb':
case 't':
$value *= 1024;
case 'gb':
case 'g':
$value *= 1024;
case 'mb':
case 'm':
$value *= 1024;
case 'kb':
case 'k':
$value *= 1024;
>
return $value;
>
Yet another implementation of return_bytes:
function return_bytes ( $val )
assert ( '1 === preg_match("/^\d+([kmg])?$/i", $val)' );
static $map = array ( 'k' => 1024 , 'm' => 1048576 , 'g' => 1073741824 );
return (int) $val * @( $map [ strtolower ( substr ( $val , - 1 ))] ?: 1 );
>
?>
If you're using PHP >= 7, you might replace ?: with ?? to avoid the use of the @ silencer.
Here is how to accurately test for boolean php.ini values:
function ini_get_bool ( $a )
$b = ini_get ( $a );
switch ( strtolower ( $b ))
case 'on' :
case 'yes' :
case 'true' :
return 'assert.active' !== $a ;
case 'stdout' :
case 'stderr' :
return 'display_errors' === $a ;
You can set custom entries in the ini file to provide globals such as database details.
However these must be retrieved with get_cfg_var, ini_get won't work.
In a similar vein, converting flags to booleans proper:
function return_boolean ( $val )
static $map = array ( 'on' => true , 'true' => true , 'off' => false , 'false' => false );
return @( $map [ strtolower ( $val )] ?: (bool) $val );
>
?>
If you're using PHP >= 7, consider replacing ?: with ?? and removing the @ silencer.
It might be useful for included scripts that include other files to extend the 'include_path' variable:
Sometimes, it may also be useful to store the current 'include_path' in a variable, overwrite it, include, and then restore the old 'include_path'.
parse_ini_file() loads in the ini file specified in filename , and returns the settings in it in an associative array.
The structure of the ini file is the same as the php.ini 's.
Parameters
The filename of the ini file being parsed. If a relative path is used, it is evaluated relative to the current working directory, then the include_path.
By setting the process_sections parameter to true , you get a multidimensional array, with the section names and settings included. The default for process_sections is false
Can either be INI_SCANNER_NORMAL (default) or INI_SCANNER_RAW . If INI_SCANNER_RAW is supplied, then option values will not be parsed.
As of PHP 5.6.1 can also be specified as INI_SCANNER_TYPED . In this mode boolean, null and integer types are preserved when possible. String values "true" , "on" and "yes" are converted to true . "false" , "off" , "no" and "none" are considered false . "null" is converted to null in typed mode. Also, all numeric strings are converted to integer type if it is possible.
Return Values
The settings are returned as an associative array on success, and false on failure.
Examples
Constants (but not "magic constants" like __FILE__ ) may also be parsed in the ini file so if you define a constant as an ini value before running parse_ini_file() , it will be integrated into the results. Only ini values are evaluated, and the value must be just the constant. For example:
define ( 'BIRD' , 'Dodo bird' );
// Parse without sections
$ini_array = parse_ini_file ( "sample.ini" );
print_r ( $ini_array );
// Parse with sections
$ini_array = parse_ini_file ( "sample.ini" , true );
print_r ( $ini_array );
The above example will output something similar to:
// A simple function used for comparing the results below
function yesno ( $expression )
return( $expression ? 'Yes' : 'No' );
>
// Get the path to php.ini using the php_ini_loaded_file() function
$ini_path = php_ini_loaded_file ();
// Parse php.ini
$ini = parse_ini_file ( $ini_path );
// Print and compare the values, note that using get_cfg_var()
// will give the same results for parsed and loaded here
echo '(parsed) magic_quotes_gpc = ' . yesno ( $ini [ 'magic_quotes_gpc' ]) . PHP_EOL ;
echo '(loaded) magic_quotes_gpc = ' . yesno ( get_cfg_var ( 'magic_quotes_gpc' )) . PHP_EOL ;
?>
The above example will output something similar to:
In addition to evaluating constants, certain characters have special meaning in an ini value. Additionally, environment variables and previously defined configuration options (see get_cfg_var() ) may be read using $<> syntax.
Some characters have special meaning in double-quoted strings and must be escaped by the backslash prefix. First of all, these are the double quote " as the boundary marker, and the backslash \ itself (if followed by one of the special characters):
There is an exception made for Windows-like paths: it's possible to not escape trailing backslash if the quoted string is directly followed by a linebreak:
If one does need to escape double quote followed by linebreak in a multiline value, it's possible to use value concatenation in the following way (there is one double-quoted string directly followed by another one):
Another character with special meaning is $ (the dollar sign). It must be escaped if followed by the open curly brace:
Escaping characters is not supported in the INI_SCANNER_RAW mode (in this mode all characters are processed "as is").
Note that the ini parser doesn't support standard escape sequences ( \n , \t , etc.). If necessary, post-process the result of parse_ini_file() with stripcslashes() function.
Notes
Note:
This function has nothing to do with the php.ini file. It is already processed by the time you run your script. This function can be used to read in your own application's configuration files.
Note:
If a value in the ini file contains any non-alphanumeric characters it needs to be enclosed in double-quotes (").
Note: There are reserved words which must not be used as keys for ini files. These include: null , yes , no , true , false , on , off , none . Values null , off , no and false result in "" , and values on , yes and true result in "1" , unless INI_SCANNER_TYPED mode is used. Characters ?<>|&~!()^" must not be used anywhere in the key and have a special meaning in the value.
Note:
Entries without an equal sign are ignored. For example, "foo" is ignored whereas "bar =" is parsed and added with an empty value. For example, MySQL has a "no-auto-rehash" setting in my.cnf that does not take a value, so it is ignored.
Note:
ini files are generally treated as plain text by web servers and thus served to browsers if requested. That means for security you must either keep your ini files outside of your docroot or reconfigure your web server to not serve them. Failure to do either of those may introduce a security risk.
See Also
User Contributed Notes 15 notes
Here is a quick parse_ini_file wrapper to add extend support to save typing and redundancy.
/**
* Parses INI file adding extends functionality via ":base" postfix on namespace.
*
* @param string $filename
* @return array
*/
function parse_ini_file_extended ( $filename ) $p_ini = parse_ini_file ( $filename , true );
$config = array();
foreach( $p_ini as $namespace => $properties ) list( $name , $extends ) = explode ( ':' , $namespace );
$name = trim ( $name );
$extends = trim ( $extends );
// create namespace if necessary
if(!isset( $config [ $name ])) $config [ $name ] = array();
// inherit base namespace
if(isset( $p_ini [ $extends ])) foreach( $p_ini [ $extends ] as $prop => $val )
$config [ $name ][ $prop ] = $val ;
>
// overwrite / set current namespace values
foreach( $properties as $prop => $val )
$config [ $name ][ $prop ] = $val ;
>
return $config ;
>
?>
Treats this ini:
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default
[archive : base]
database=archive
*/
?>
As if it were like this:
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default
You may want, in some very special cases, to parse multi-dimensional array with N levels in your ini file. Something like setting[data][config][debug] = true will result in an error (expected " default"> function parse_ini_file_multi ( $file , $process_sections = false , $scanner_mode = INI_SCANNER_NORMAL ) $explode_str = '.' ;
$escape_char = "'" ;
// load ini file the normal way
$data = parse_ini_file ( $file , $process_sections , $scanner_mode );
if (! $process_sections ) $data = array( $data );
>
foreach ( $data as $section_key => $section ) // loop inside the section
foreach ( $section as $key => $value ) if ( strpos ( $key , $explode_str )) if ( substr ( $key , 0 , 1 ) !== $escape_char ) // key has a dot. Explode on it, then parse each subkeys
// and set value at the right place thanks to references
$sub_keys = explode ( $explode_str , $key );
$subs =& $data [ $section_key ];
foreach ( $sub_keys as $sub_key ) if (!isset( $subs [ $sub_key ])) $subs [ $sub_key ] = [];
>
$subs =& $subs [ $sub_key ];
>
// set the value at the right place
$subs = $value ;
// unset the dotted key, we don't need it anymore
unset( $data [ $section_key ][ $key ]);
>
// we have escaped the key, so we keep dots as they are
else $new_key = trim ( $key , $escape_char );
$data [ $section_key ][ $new_key ] = $value ;
unset( $data [ $section_key ][ $key ]);
>
>
>
>
if (! $process_sections ) $data = $data [ 0 ];
>
return $data ;
>
?>
The following file:
/*
[normal]
foo = bar
; use quotes to keep your key as it is
'foo.with.dots' = true
[dictionary]
foo[debug] = false
foo[path] = /some/path
[multi]
foo.data.config.debug = true
foo.data.password = 123456
*/
?>
will result in:
parse_ini_file_multi ( 'file.ini' , true );
Array
(
[ normal ] => Array
(
[ foo ] => bar
[ foo . with . dots ] => 1
)
[array] => Array
(
[ foo ] => Array
(
[ 0 ] => 1
[ 1 ] => 2
)
)
[ dictionary ] => Array
(
[ foo ] => Array
(
[ debug ] =>
[ path ] => / some / path
)
)
[ multi ] => Array
(
[ foo ] => Array
(
[ data ] => Array
(
[ config ] => Array
(
[ debug ] => 1
)
[ password ] => 123456
)
)
)
)
?>
.ini files or JSON file format as it is also known as, are very useful format to store stuff in. Especially large arrays.
Strangely enough there is this nice function to read the file, but no function to write it.
Use it as: put_ini_file(string $file, array $array)
function put_ini_file ( $file , $array , $i = 0 ) $str = "" ;
foreach ( $array as $k => $v ) if ( is_array ( $v )) $str .= str_repeat ( " " , $i * 2 ). "[ $k ]" . PHP_EOL ;
$str .= put_ini_file ( "" , $v , $i + 1 );
>else
$str .= str_repeat ( " " , $i * 2 ). " $k = $v " . PHP_EOL ;
>
if( $file )
return file_put_contents ( $file , $str );
else
return $str ;
>
?>
This is a simple (but slightly hackish) way of avoiding the character limitations (in values):
define ( 'QUOTE' , '"' );
$test = parse_ini_file ( 'test.ini' );
echo "" ;
print_r ( $test );
?>
contents of test.ini:
park yesterday = "I (walked) | " QUOTE"the"QUOTE " park yesterday & saw ~three~ dogs!"
Array
(
[ park yesterday ] => I ( walked ) | < to >"the" park yesterday & saw ~ three ~ dogs !
)
?>
The documentation states:
Characters ?<>|&~!()^" must not be used anywhere in the key and have a special meaning in the value.
Here's the results of my experiments on what they mean:
; | is used for bitwise OR
three = 2|3
; & is used for bitwise AND
four = 6&5
; ^ is used for bitwise XOR
five = 3^6
; ~ is used for bitwise negate
negative_two = ~1
; () is used for grouping
seven = (8|7)&(6|5)
; $ <. >is used for grabbing values from the environment, or previously defined values.
path = $
also = $
; ? I have no guess for
; ! I have no guess for
This function for save ini files
function array_to_ini ( $array , $out = "" )
<
$t = "" ;
$q = false ;
foreach( $array as $c => $d )
<
if( is_array ( $d )) $t .= array_to_ini ( $d , $c );
else
<
if( $c === intval ( $c ))
<
if(!empty( $out ))
<
$t .= "\r\n" . $out . " = \"" . $d . "\"" ;
if( $q != 2 ) $q = true ;
>
else $t .= "\r\n" . $d ;
>
else
<
$t .= "\r\n" . $c . " = \"" . $d . "\"" ;
$q = 2 ;
>
>
>
if( $q != true && !empty( $out )) return "[" . $out . "]\r\n" . $t ;
if(!empty( $out )) return $t ;
return trim ( $t );
>
function save_ini_file ( $array , $file )
<
$a = array_to_ini ( $array );
$ffl = fopen ( $file , "w" );
fwrite ( $ffl , $a );
fclose ( $ffl );
>
?>
Looks like in PHP 5.3.0 special characters like \n are extrapolated into real newlines. Gotta use \\n.
Just a quick note for all those running into trouble escaping double quotes:
I got around this by "base64_encode()"-ing my content on the way in to the ini file, and "base64_decode()"-ing on the way out.
Because base64 uses the " TmlhZ2FyYSBGYWxscywgT04 note" >
Warning: parse_ini_files cannot cope with values containing the equal sign (=).
The following function supports sections, comments, arrays, and key-value pairs outside of any section.
Beware that similar keys will overwrite one another (unless in different sections).
function parse_ini ( $filepath ) $ini = file ( $filepath );
if ( count ( $ini ) == 0 ) < return array(); >
$sections = array();
$values = array();
$globals = array();
$i = 0 ;
foreach( $ini as $line ) $line = trim ( $line );
// Comments
if ( $line == '' || $line < 0 >== ';' ) < continue; >
// Sections
if ( $line < 0 >== '[' ) $sections [] = substr ( $line , 1 , - 1 );
$i ++;
continue;
>
// Key-value pair
list( $key , $value ) = explode ( '=' , $line , 2 );
$key = trim ( $key );
$value = trim ( $value );
if ( $i == 0 ) // Array values
if ( substr ( $line , - 1 , 2 ) == '[]' ) $globals [ $key ][] = $value ;
> else $globals [ $key ] = $value ;
>
> else // Array values
if ( substr ( $line , - 1 , 2 ) == '[]' ) $values [ $i - 1 ][ $key ][] = $value ;
> else $values [ $i - 1 ][ $key ] = $value ;
>
>
>
for( $j = 0 ; $j < $i ; $j ++ ) $result [ $sections [ $j ] ] = $values [ $j ];
>
return $result + $globals ;
>
?>
Example usage:
$stores = parse_ini ( 'stores.ini' );
print_r ( $stores );
?>
An example ini file:
/*
;Commented line start with ';'
global_value1 = a string value
global_value1 = another string value
; empty lines are discarded
[Section1]
key = value
; whitespace around keys and values is discarded too
otherkey=other value
otherkey=yet another value
; this key-value pair will overwrite the former.
*/
?>
Not mentioned in the documentation, this function acts like include:
"Files are included based on the file path given or, if none is given, the include_path specified. If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing."
(At least for PHP 7; have not checked PHP 5.)
This core function won't handle ini key[][] = value(s), (multidimensional arrays), so if you need to support that kind of setup you will need to write your own function. one way to do it is to convert all the key = value(s) to array string Функция читает настройки конфигурационного файла php[][]=value(s), then use parse_str() to convert all those Функция читает настройки конфигурационного файла php[][]=value(s) that way you just read the ini file line by line, instead of doing crazy foreach() loops to handle those (multidimensional arrays) in each section, example.
ini file. config.php
; This is a sample configuration file
; Comments start with ';' , as in php . ini
[ first_section ]
one = 1
five = 5
animal = BIRD
[ third_section ]
phpversion [] = "5.0"
phpversion [] = "5.1"
phpversion [] = "5.2"
phpversion [] = "5.3"
a [][][] = b
a [][][][] = c
a [ test_test ][][] = d
test [ one ][ two ][ three ] = true
?>
echo parse_ini_file ( "C:\\services\\www\\docs\\config.php" );
// PHP Warning: syntax error, unexpected TC_SECTION, expecting '=' line 27 -> a[][][] = b
Here it simple function that handles (multidimensional arrays) without looping each key[][]= value(s)
function getIni ( $file , $sections = FALSE )
$return = array ();
$config = fopen ( $file , 'r' );
while ( ! feof ( $config ) )
<
$line = trim ( fgets ( $config , 1024 ) );
$line = ( $line == '' ) ? ' ' : $line ;
if ( $sections )
$header = 'config[' . trim ( substr ( $line , 1 , - 1 ) ) . ']' ;
>
else
$header = 'config' ;
>
$kv = array_map ( 'trim' , explode ( '=' , $line ) );
$kv [ 0 ] = str_replace ( ' ' , '+' , $kv [ 0 ] );
$kv [ 1 ] = str_replace ( ' ' , '+' , $kv [ 1 ] );
if ( ( $pos = strpos ( $kv [ 0 ], '[' ) ) !== FALSE )
$kv [ 0 ] = '[' . substr ( $kv [ 0 ], 0 , $pos ) . ']' . substr ( $kv [ 0 ], $pos );
>
else
$kv [ 0 ] = '[' . $kv [ 0 ] . ']' ;
>
$bt = strtolower ( $kv [ 1 ] );
if ( in_array ( $bt , array ( 'true' , 'false' , 'on' , 'off' ) ) )
$kv [ 1 ] = ( $bt == 'true' || $bt == 'on' ) ? TRUE : FALSE ;
>
$keeper [] = $header . $kv [ 0 ] . '=' . $kv [ 1 ];
>
>
return $return [ 'config' ];
>
print_r ( $config -> getIni ( "C:\\services\\www\\docs\\config.php" ), $sections );
Список параметров
Необязательное имя модуля. Если не null и не строка ( string ) core , функция возвращает только параметры.
Выводить детальные сведения о настройках или только текущие значения. По умолчанию true (выводить детальные сведения).
Возвращаемые значения
Возвращает ассоциативный массив с именами директив в качестве ключей. Возвращает false и вызывает ошибку уровня E_WARNING , если extension не существует.
Если details равен true (по умолчанию), в массиве будут содержаться global_value (значение настройки php.ini ), local_value (например, заданное с помощью ini_set() или .htaccess ) и access (уровень доступа).
Если details равен false , значением массива будет соответствующее текущее значение настройки.
Смотрите соответствующий раздел руководства, в котором приводится описание уровней доступа.
Замечание:
Директива может иметь несколько уровней доступа, в этом случае access будет содержать соответствующую битовую маску.
Примеры
Результатом выполнения данного примера будет что-то подобное:
print_r ( ini_get_all ( "pcre" , false )); // Добавлено в PHP 5.3.0
print_r ( ini_get_all ( null , false )); // Добавлено в PHP 5.3.0
?>?php
Результатом выполнения данного примера будет что-то подобное:
Примечания
Замечание:
ini_get_all() игнорирует опции типа "массив" такие как pdo.dsn.*.
Смотрите также
User Contributed Notes 5 notes
I guess the third entry is the required access level (to change this variable at runtime):
See also the docs for ini_set()
If you want to load and parse your own ini file, have a look at parse_ini_file() function. Example:
// .
$my_data = parse_ini_file ( $my_file , true );
/**
* Sample function to re-create a php ini config file.
*
* @return string
*/
function recreate_php_ini() $a = ini_get_all();
$data = [];
foreach (array_keys($a) as $k) $ss = split("\.", $k);
if (count($ss) == 1) $sec = "PHP";
$v = $k;
> else $sec = $ss[0];
$v = $ss[1];
>
$data[$sec][$v] = $a[$k]['global_value'];
>
ksort($data);
$out = "";
foreach ($data as $sec => $data) $out .= "[$sec]\n";
ksort($data);
foreach ($data as $k => $v) if (is_numeric($v)) $out .= sprintf("%-40s = %s\n", $k, $v);
> else $out .= sprintf("%-40s = \"%s\"\n", $k, $v);
>
>
$out .= "\n";
>
return $out;
>
You can use the following snippet on servers to grab the live/staging configs in order to be able to replicate those in your development environment. (I use `php -a` for this)
foreach ( ini_get_all ( null , false ) as $key => $value ) echo " $key = $value ;\n" ;
?>
The constants mentioned below are available in PHP, but without the prefix (e.g. INI_USER, INI_PERDIR).
parse_ini_file() загружает ini-файл, указанный в аргументе filename , и возвращает его настройки в виде ассоциативного массива.
Структура ini-файла похожа на структуру php.ini .
Список параметров
Имя обрабатываемого ini-файла. Если используется относительный путь, он оценивается относительно текущего рабочего каталога, а затем include_path.
Установив параметр process_sections в true , вы получаете многомерный массив, который включает как название отдельных настроек, так и секции. По умолчанию process_sections равен false
Может принимать следующие значения: INI_SCANNER_NORMAL (по умолчанию) или INI_SCANNER_RAW . Если указано значение INI_SCANNER_RAW , то значения опций не будут обрабатываться.
С версии PHP 5.6.1 также можно задать INI_SCANNER_TYPED . В этом режиме типы boolean, null и integer будут, по возможности, сохраняться. Строковые значения "true" , "on" и "yes" будут преобразованы в true . "false" , "off" , "no" и "none" в false . "null" преобразуется в null . Кроме этого, все числовые строки будут, по возможности, преобразованы к целым числам.
Возвращаемые значения
В случае успешного выполнения, настройки возвращаются в виде ассоциативного массива ( array ). В случае возникновения ошибки возвращается false .
Примеры
Константы (но не "магические константы" вроде __FILE__ ) также могут обрабатываться в ini-файлах, так что если вы объявите константу в виде значения для ini-файла до вызова parse_ini_file() , то константа будет корректно обработана. Только значения опций будут обрабатываться и значение должно быть просто константой. Например:
define ( 'BIRD' , 'Птица додо' );
// Обрабатываем без секций
$ini_array = parse_ini_file ( "sample.ini" );
print_r ( $ini_array );
// Обрабатываем с секциями
$ini_array = parse_ini_file ( "sample.ini" , true );
print_r ( $ini_array );
Результатом выполнения данного примера будет что-то подобное:
// Простая функция для сравнения результатов
function yesno ( $expression )
return( $expression ? 'Да' : 'Нет' );
>
// Получаем путь к php.ini с помощью функции php_ini_loaded_file()
$ini_path = php_ini_loaded_file ();
// Обрабатываем php.ini
$ini = parse_ini_file ( $ini_path );
// Выводим и сравниваем значения, учтите, что использование get_cfg_var()
// даст одинаковые результаты для используемых здесь значений parsed (загруженное из файла) и loaded (используемое в данный момент)
echo '(parsed) magic_quotes_gpc = ' . yesno ( $ini [ 'magic_quotes_gpc' ]) . PHP_EOL ;
echo '(loaded) magic_quotes_gpc = ' . yesno ( get_cfg_var ( 'magic_quotes_gpc' )) . PHP_EOL ;
?>
Результатом выполнения данного примера будет что-то подобное:
Помимо оценки констант, некоторые символы имеют особое значение в значении ini-файлах. Кроме того, переменные среды и ранее определённые параметры конфигурации (смотрите get_cfg_var() ) могут быть прочитаны с использованием синтаксиса $<> .
Некоторые символы имеют особое значение в строках с двойными кавычками и должны быть экранированы префиксом обратной косой черты. Прежде всего, это двойная кавычка " в качестве маркера границы и сама обратная косая черта \ (если за ней следует один из специальных символов):
Для путей, подобных Windows, сделано исключение: можно не экранировать обратную косую черту в конце, если за строкой в кавычках следует разрыв строки:
Если нужно экранировать двойные кавычки, за которыми следует перенос строки в многострочном значении, можно использовать конкатенацию значений следующим образом (за одной строкой в двойных кавычках непосредственно следует другая):
Другой символ со специальным значением - это $ (знак доллара). Он должен быть экранирован, если за ним следует открытая фигурная скобка:
Экранирующие символы не поддерживаются в режиме INI_SCANNER_RAW (в этом режиме все символы обрабатываются "как есть").
Обратите внимание, что синтаксический анализатор ini не поддерживает стандартные последовательности экранирования ( \n , \t и т.д.). При необходимости выполните постобработку результата parse_ini_file() с помощью функции stripcslashes() .
Примечания
Замечание:
Эта функция не имеет никакого отношения к файлу php.ini . К моменту выполнения вашего скрипта, он уже обработан. Эта функция может быть использована для загрузки настроек вашего собственного приложения.
Замечание:
Если значение в ini-файле содержит прочие символы, кроме букв и цифр, оно должно заключаться в двойные кавычки (").
Замечание: Существует зарезервированные слова, которые нельзя использовать в качестве ключей в ini-файлах. Такими словами являются: null , yes , no , true , false , on , off , none . Значения null , off , no и false преобразуются в "" , а значения on , yes и true в "1" , но только если не используется режим INI_SCANNER_TYPED . Символы ?<>|&~!()^" не должны использоваться в ключах и иметь какой-либо особый смысл в значениях.
Замечание:
Записи без знака равенства игнорируются. Например, "foo" игнорируется, тогда как "bar =" обрабатывается и добавляется с пустым значением. Например, в MySQL есть опция "no-auto-rehash", устанавливаемая в my.cnf , которая не имеет значения и игнорируется.
Замечание:
ini-файлы обычно обрабатываются веб-серверами как простой текст и, таким образом, по запросу передаются браузерам. Это означает, что в целях безопасности вы должны либо хранить свои ini-файлы вне корневого каталога документов, либо перенастроить веб-сервер, чтобы они не обслуживались. Невыполнение любого из этих требований может создать угрозу безопасности.
Смотрите также
User Contributed Notes 15 notes
Here is a quick parse_ini_file wrapper to add extend support to save typing and redundancy.
/**
* Parses INI file adding extends functionality via ":base" postfix on namespace.
*
* @param string $filename
* @return array
*/
function parse_ini_file_extended ( $filename ) $p_ini = parse_ini_file ( $filename , true );
$config = array();
foreach( $p_ini as $namespace => $properties ) list( $name , $extends ) = explode ( ':' , $namespace );
$name = trim ( $name );
$extends = trim ( $extends );
// create namespace if necessary
if(!isset( $config [ $name ])) $config [ $name ] = array();
// inherit base namespace
if(isset( $p_ini [ $extends ])) foreach( $p_ini [ $extends ] as $prop => $val )
$config [ $name ][ $prop ] = $val ;
>
// overwrite / set current namespace values
foreach( $properties as $prop => $val )
$config [ $name ][ $prop ] = $val ;
>
return $config ;
>
?>
Treats this ini:
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default
[archive : base]
database=archive
*/
?>
As if it were like this:
/*
[base]
host=localhost
user=testuser
pass=testpass
database=default
You may want, in some very special cases, to parse multi-dimensional array with N levels in your ini file. Something like setting[data][config][debug] = true will result in an error (expected " default"> function parse_ini_file_multi ( $file , $process_sections = false , $scanner_mode = INI_SCANNER_NORMAL ) $explode_str = '.' ;
$escape_char = "'" ;
// load ini file the normal way
$data = parse_ini_file ( $file , $process_sections , $scanner_mode );
if (! $process_sections ) $data = array( $data );
>
foreach ( $data as $section_key => $section ) // loop inside the section
foreach ( $section as $key => $value ) if ( strpos ( $key , $explode_str )) if ( substr ( $key , 0 , 1 ) !== $escape_char ) // key has a dot. Explode on it, then parse each subkeys
// and set value at the right place thanks to references
$sub_keys = explode ( $explode_str , $key );
$subs =& $data [ $section_key ];
foreach ( $sub_keys as $sub_key ) if (!isset( $subs [ $sub_key ])) $subs [ $sub_key ] = [];
>
$subs =& $subs [ $sub_key ];
>
// set the value at the right place
$subs = $value ;
// unset the dotted key, we don't need it anymore
unset( $data [ $section_key ][ $key ]);
>
// we have escaped the key, so we keep dots as they are
else $new_key = trim ( $key , $escape_char );
$data [ $section_key ][ $new_key ] = $value ;
unset( $data [ $section_key ][ $key ]);
>
>
>
>
if (! $process_sections ) $data = $data [ 0 ];
>
return $data ;
>
?>
The following file:
/*
[normal]
foo = bar
; use quotes to keep your key as it is
'foo.with.dots' = true
[dictionary]
foo[debug] = false
foo[path] = /some/path
[multi]
foo.data.config.debug = true
foo.data.password = 123456
*/
?>
will result in:
parse_ini_file_multi ( 'file.ini' , true );
Array
(
[ normal ] => Array
(
[ foo ] => bar
[ foo . with . dots ] => 1
)
[array] => Array
(
[ foo ] => Array
(
[ 0 ] => 1
[ 1 ] => 2
)
)
[ dictionary ] => Array
(
[ foo ] => Array
(
[ debug ] =>
[ path ] => / some / path
)
)
[ multi ] => Array
(
[ foo ] => Array
(
[ data ] => Array
(
[ config ] => Array
(
[ debug ] => 1
)
[ password ] => 123456
)
)
)
)
?>
.ini files or JSON file format as it is also known as, are very useful format to store stuff in. Especially large arrays.
Strangely enough there is this nice function to read the file, but no function to write it.
Use it as: put_ini_file(string $file, array $array)
function put_ini_file ( $file , $array , $i = 0 ) $str = "" ;
foreach ( $array as $k => $v ) if ( is_array ( $v )) $str .= str_repeat ( " " , $i * 2 ). "[ $k ]" . PHP_EOL ;
$str .= put_ini_file ( "" , $v , $i + 1 );
>else
$str .= str_repeat ( " " , $i * 2 ). " $k = $v " . PHP_EOL ;
>
if( $file )
return file_put_contents ( $file , $str );
else
return $str ;
>
?>
This is a simple (but slightly hackish) way of avoiding the character limitations (in values):
define ( 'QUOTE' , '"' );
$test = parse_ini_file ( 'test.ini' );
echo "" ;
print_r ( $test );
?>
contents of test.ini:
park yesterday = "I (walked) | " QUOTE"the"QUOTE " park yesterday & saw ~three~ dogs!"
Array
(
[ park yesterday ] => I ( walked ) | < to >"the" park yesterday & saw ~ three ~ dogs !
)
?>
The documentation states:
Characters ?<>|&~!()^" must not be used anywhere in the key and have a special meaning in the value.
Here's the results of my experiments on what they mean:
; | is used for bitwise OR
three = 2|3
; & is used for bitwise AND
four = 6&5
; ^ is used for bitwise XOR
five = 3^6
; ~ is used for bitwise negate
negative_two = ~1
; () is used for grouping
seven = (8|7)&(6|5)
; $ <. >is used for grabbing values from the environment, or previously defined values.
path = $
also = $
; ? I have no guess for
; ! I have no guess for
This function for save ini files
function array_to_ini ( $array , $out = "" )
<
$t = "" ;
$q = false ;
foreach( $array as $c => $d )
<
if( is_array ( $d )) $t .= array_to_ini ( $d , $c );
else
<
if( $c === intval ( $c ))
<
if(!empty( $out ))
<
$t .= "\r\n" . $out . " = \"" . $d . "\"" ;
if( $q != 2 ) $q = true ;
>
else $t .= "\r\n" . $d ;
>
else
<
$t .= "\r\n" . $c . " = \"" . $d . "\"" ;
$q = 2 ;
>
>
>
if( $q != true && !empty( $out )) return "[" . $out . "]\r\n" . $t ;
if(!empty( $out )) return $t ;
return trim ( $t );
>
function save_ini_file ( $array , $file )
<
$a = array_to_ini ( $array );
$ffl = fopen ( $file , "w" );
fwrite ( $ffl , $a );
fclose ( $ffl );
>
?>
Looks like in PHP 5.3.0 special characters like \n are extrapolated into real newlines. Gotta use \\n.
Just a quick note for all those running into trouble escaping double quotes:
I got around this by "base64_encode()"-ing my content on the way in to the ini file, and "base64_decode()"-ing on the way out.
Because base64 uses the " TmlhZ2FyYSBGYWxscywgT04 note" >
Warning: parse_ini_files cannot cope with values containing the equal sign (=).
The following function supports sections, comments, arrays, and key-value pairs outside of any section.
Beware that similar keys will overwrite one another (unless in different sections).
function parse_ini ( $filepath ) $ini = file ( $filepath );
if ( count ( $ini ) == 0 ) < return array(); >
$sections = array();
$values = array();
$globals = array();
$i = 0 ;
foreach( $ini as $line ) $line = trim ( $line );
// Comments
if ( $line == '' || $line < 0 >== ';' ) < continue; >
// Sections
if ( $line < 0 >== '[' ) $sections [] = substr ( $line , 1 , - 1 );
$i ++;
continue;
>
// Key-value pair
list( $key , $value ) = explode ( '=' , $line , 2 );
$key = trim ( $key );
$value = trim ( $value );
if ( $i == 0 ) // Array values
if ( substr ( $line , - 1 , 2 ) == '[]' ) $globals [ $key ][] = $value ;
> else $globals [ $key ] = $value ;
>
> else // Array values
if ( substr ( $line , - 1 , 2 ) == '[]' ) $values [ $i - 1 ][ $key ][] = $value ;
> else $values [ $i - 1 ][ $key ] = $value ;
>
>
>
for( $j = 0 ; $j < $i ; $j ++ ) $result [ $sections [ $j ] ] = $values [ $j ];
>
return $result + $globals ;
>
?>
Example usage:
$stores = parse_ini ( 'stores.ini' );
print_r ( $stores );
?>
An example ini file:
/*
;Commented line start with ';'
global_value1 = a string value
global_value1 = another string value
; empty lines are discarded
[Section1]
key = value
; whitespace around keys and values is discarded too
otherkey=other value
otherkey=yet another value
; this key-value pair will overwrite the former.
*/
?>
Not mentioned in the documentation, this function acts like include:
"Files are included based on the file path given or, if none is given, the include_path specified. If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing."
(At least for PHP 7; have not checked PHP 5.)
This core function won't handle ini key[][] = value(s), (multidimensional arrays), so if you need to support that kind of setup you will need to write your own function. one way to do it is to convert all the key = value(s) to array string Функция читает настройки конфигурационного файла php[][]=value(s), then use parse_str() to convert all those Функция читает настройки конфигурационного файла php[][]=value(s) that way you just read the ini file line by line, instead of doing crazy foreach() loops to handle those (multidimensional arrays) in each section, example.
ini file. config.php
; This is a sample configuration file
; Comments start with ';' , as in php . ini
[ first_section ]
one = 1
five = 5
animal = BIRD
[ third_section ]
phpversion [] = "5.0"
phpversion [] = "5.1"
phpversion [] = "5.2"
phpversion [] = "5.3"
a [][][] = b
a [][][][] = c
a [ test_test ][][] = d
test [ one ][ two ][ three ] = true
?>
echo parse_ini_file ( "C:\\services\\www\\docs\\config.php" );
// PHP Warning: syntax error, unexpected TC_SECTION, expecting '=' line 27 -> a[][][] = b
Here it simple function that handles (multidimensional arrays) without looping each key[][]= value(s)
function getIni ( $file , $sections = FALSE )
$return = array ();
$config = fopen ( $file , 'r' );
while ( ! feof ( $config ) )
<
$line = trim ( fgets ( $config , 1024 ) );
$line = ( $line == '' ) ? ' ' : $line ;
if ( $sections )
$header = 'config[' . trim ( substr ( $line , 1 , - 1 ) ) . ']' ;
>
else
$header = 'config' ;
>
$kv = array_map ( 'trim' , explode ( '=' , $line ) );
$kv [ 0 ] = str_replace ( ' ' , '+' , $kv [ 0 ] );
$kv [ 1 ] = str_replace ( ' ' , '+' , $kv [ 1 ] );
if ( ( $pos = strpos ( $kv [ 0 ], '[' ) ) !== FALSE )
$kv [ 0 ] = '[' . substr ( $kv [ 0 ], 0 , $pos ) . ']' . substr ( $kv [ 0 ], $pos );
>
else
$kv [ 0 ] = '[' . $kv [ 0 ] . ']' ;
>
$bt = strtolower ( $kv [ 1 ] );
if ( in_array ( $bt , array ( 'true' , 'false' , 'on' , 'off' ) ) )
$kv [ 1 ] = ( $bt == 'true' || $bt == 'on' ) ? TRUE : FALSE ;
>
$keeper [] = $header . $kv [ 0 ] . '=' . $kv [ 1 ];
>
>
return $return [ 'config' ];
>
print_r ( $config -> getIni ( "C:\\services\\www\\docs\\config.php" ), $sections );
Читайте также: