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 檔案中的確切字串,而不是其 int 等效值。嘗試對這些值進行一般的算術運算,將不會產生預期的結果。上面的範例顯示了一種將簡寫表示法轉換為位元組的方式,很像 PHP 來源程式碼的處理方式。

注意:

ini_get() 無法讀取「陣列」ini 選項,例如 pdo.dsn.*,在此情況下會傳回 false

參見

新增註解

使用者貢獻的註解 12 則註解

34
Stas Trefilov, OpteamIS
14 年前
另一個 return_bytes 版本,其傳回速度更快,且不使用多次乘法運算(抱歉:)。即使在編譯時解析,這也不是一個好習慣;
未配置任何本地變數;
省略了 trim() (php 在讀取 php.ini 檔案時已修剪值);
strtolower() 已被第二個 case 取代,這讓我們多了一次函式呼叫,代價是將要處理的 case 數量加倍(最壞情況下可能會變慢,因為需要進行六次比較,而不是三次比較和一個函式呼叫);
case 是依照最常發生的順序排列(大寫 M 值為預設大小);
規格說明我們必須處理整數大小,因此浮點數值會轉換為整數,而 0.8G 會變成 0;
未實作 'Gb'、'Mb'、'Kb' 簡寫位元組選項,因為不在規格中,請參閱
https://php.dev.org.tw/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 乘以符合條件的值的結果
# 注意:(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;
}

#
# 測試:如果與 match 標準不符,則預設為 0
#
echo getBytes('2GB') . "</br>";
# 輸出:2147483648
echo getBytes('4tb') . "</br>";
# 輸出:4398046511104
echo getBytes('5345etrgrfd') . "</br>";
# 輸出:0
echo getBytes('357568336586') . "</br>";
# 輸出:0
?>
8
IceNV
7 年前
請注意,`max_execution_time` 可以被 XDebug 修改。

當在本機除錯一個使用 <?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