2024年PHP开发者大会日本站

ini_get

(PHP 4, PHP 5, PHP 7, PHP 8)

ini_get获取配置选项的值

描述

ini_get(字符串 $option): 字符串|false

成功时返回配置选项的值。

参数

option

配置选项名称。

返回值

成功时返回配置选项的值(字符串),对于null值返回空字符串。如果配置选项不存在,则返回false

示例

示例 #1 一些 ini_get() 示例

<?php

/*
我们的php.ini包含以下设置:

display_errors = On
register_globals = Off
post_max_size = 8M
*/

echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo
'register_globals = ' . (int) ini_get('register_globals') . "\n";
echo
'post_max_size = ' . ini_get('post_max_size') . "\n";
echo
'post_max_size + 1 = ' . (rtrim(ini_get('post_max_size'), 'KMG') + 1) . "\n";
echo
'post_max_size in bytes = ' . return_bytes(ini_get('post_max_size'));

function
return_bytes($val)
{
$val = trim($val);
$num = (int) rtrim($val, 'KMG');
$last = strtolower($val[strlen($val) - 1]);

switch (
$last) {
// 'G' 修饰符可用
case 'g':
$num = $num * 1024 * 1024 * 1024;
break;
case
'm':
$num = $num * 1024 * 1024;
break;
case
'k':
$num *= 1024;
break;
}

return
$num;
}

?>

以上示例将输出类似以下内容

display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9
post_max_size in bytes = 8388608

注释

注意: 查询布尔值时

布尔型ini值为off将返回空字符串或“0”,而布尔型ini值为on将返回“1”。该函数还可以返回INI值的字面字符串。

注意: 查询内存大小值时

许多ini内存大小值,例如upload_max_filesize,以简写形式存储在php.ini文件中。ini_get()将返回存储在php.ini文件中的精确字符串,而不是整型等效值。尝试对这些值进行正常的算术运算将不会得到预期的结果。上面的示例显示了一种将简写形式转换为字节的方法,这与PHP源代码中的方法非常相似。

注意:

ini_get()无法读取“数组”类型的ini选项,例如pdo.dsn.*,在这种情况下将返回false

参见

添加注释

用户贡献的注释 12条注释

34
Stas Trefilov, OpteamIS
14年前
另一个return_bytes版本,运行速度更快,并且不使用多次乘法(抱歉:)。即使它在编译时得到解决,它也不是一个好习惯;
没有分配局部变量;
省略了trim()(php在读取php.ini文件时已经修剪了值);
strtolower() 函数被替换为另一种方案,这使得我们少调用了一个函数,代价是需要处理两倍的case(在到达默认情况时,最坏情况下的速度可能会变慢:需要进行六次比较而不是三次比较和一次函数调用);
case 的顺序按照频率从高到低排列(大写 M 值作为默认大小);
规范要求我们必须处理整数大小,因此浮点值将转换为整数,0.8G 将变为 0;
未实现 'Gb'、'Mb'、'Kb' 等简写字节选项,因为规范中未包含这些选项,详情请参见
https://php.net/manual/en/faq.using.php#faq.using.shorthandbytes

<?php
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;
}
}
?>
6
devsrealmGuy
3年前
这是另一种使用 PHP8 获取字节结果的方法

<?php

/**
* @param string $size
* @return int
* @author DevsrealmGuy
*/
public function getBytes(string $size): int
{
$size = trim($size);

#
# 将数值与度量单位分开(例如 MB、GB、KB)
#
preg_match('/([0-9]+)[\s]*([a-zA-Z]+)/', $size, $matches);

$value = (isset($matches[1])) ? $matches[1] : 0;
$metric = (isset($matches[2])) ? strtolower($matches[2]) : 'b';

#
# $value 的结果乘以匹配的 case
# 注意:(1024 ** 2)与(1024 * 1024)或 pow(1024, 2) 相同
#
$value *= match ($metric) {
'k', 'kb' => 1024,
'm', 'mb' => (1024 ** 2),
'g', 'gb' => (1024 ** 3),
't', 'tb' => (1024 ** 4),
default =>
0
};

return (int)
$value;
}

#
# 测试:如果它不符合匹配标准,则默认为 0
#
echo getBytes('2GB') . "</br>";
# 输出:2147483648
echo getBytes('4tb') . "</br>";
# 输出:4398046511104
echo getBytes('5345etrgrfd') . "</br>";
# 输出:0
echo getBytes('357568336586') . "</br>";
# 输出:0
?>
8
IceNV
7年前
请注意,XDebug 可能会更改 `max_execution_time`。

在本地调试使用 `<?php ini_get('max_execution_time'); ?>` 的脚本时,启用 XDebug 远程调试且 IDE 正在监听时,它返回 0。

这是有道理的,因为手动调试需要时间,所以我们不希望脚本超时;但在这种特定情况下,它使脚本看起来像 `max_execution_time` 为 0,因此计算结果错误。

您可以在 `phpinfo()` 中看到在这种情况下本地值为 0,但主值是您在 php.ini 中设置的正确值。
4
filh at filh dot org
19年前
关于返回的值,这取决于您如何设置它。
我在 horde-3 中遇到了这个问题,它测试 safe_mode 值。
因此
- 如果使用 `php_admin_value safe_mode Off`(或 On)设置值,则 `ini_get` 返回字符串
- 如果使用 `php_admin_flag safe_mode Off`(或 On)设置值,则 `ini_get` 返回布尔值。
1
Ivo Mandalski
13年前
此版本的 `return_bytes` 处理了 MB、GB、KB 以及 M、G、K 的情况。
希望这对您有所帮助!

<?php
public static function return_bytes ($val)
{
if(empty(
$val))return 0;

$val = trim($val);

preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);

$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;
}

return (int)
$val;
}
?>
0
Joe Huss detain at interserver dot net
2年前
这是一个结合了此处一些示例的版本,它*不需要* PHP8,也不会生成警告

/**
* 获取从类似 '10G' 的人类可读字符串转换的字节值
*
* @param mixed $val 人类可读/简写版本的数值
* @return int 转换为字节的数值
*/
function return_bytes($val) {
$val = trim($val);
preg_match('/([0-9]+)[\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;
}
0
david dot tulloh at infaze dot com dot au
19年前
您可以在 ini 文件中设置自定义条目来提供全局变量,例如数据库详细信息。
但是,这些必须使用 `get_cfg_var` 来检索,`ini_get` 不起作用。
-1
bishop@php
9年前
另一个 `return_bytes` 的实现

<?php
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);
}
?>

如果您使用的是 PHP >= 7,您可以将 `?:` 替换为 `??` 以避免使用 `@` 静音符。
-1
peter
16年前
上面示例中名为 `return_bytes()` 的函数假设 `ini_get('upload_max_filesize')` 仅在末尾提供一个字母。因为我见过 'Mb' 之类的东西,所以我建议将 `$last = ...` 部分更改为 `$last = strtolower(substr($val,strlen($val/1),1))`。
那我把它称为$unit。
-2
nicolas dot grekas+php at gmail dot com
15年前
以下是准确测试php.ini布尔值的方法

<?php

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;

default:
return (bool) (int)
$b;
}
}

?>
-3
Der Graph
20年前
对于包含其他文件的包含脚本,扩展“include_path”变量可能很有用

<?php ini_set('include_path',ini_get('include_path').':../includes:'); ?>

有时,将当前“include_path”存储在变量中,覆盖它,包含它,然后恢复旧的“include_path”也可能很有用。
-4
bishop at php dot net
9年前
类似地,将标志转换为正确的布尔值

<?php
function return_boolean($val)
{
static
$map = array ('on' => true, 'true' => true, 'off' => false, 'false' => false);
return @(
$map[strtolower($val)] ?: (bool)$val);
}
?>

如果使用PHP >= 7,请考虑将?:替换为??,并删除@静音器。
To Top