PHP 日本研討會 2024

phpinfo

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

phpinfo輸出關於 PHP 設定的資訊

描述

phpinfo(int $flags = INFO_ALL): true

輸出關於目前 PHP 狀態的大量資訊。這包括關於 PHP 編譯選項與擴充功能、PHP 版本、伺服器資訊與環境(如果編譯為模組)、PHP 環境、作業系統版本資訊、路徑、組態選項的主值與本機值、HTTP 標頭,以及 PHP 授權。

因為每個系統的設定方式都不同,phpinfo() 通常用於檢查 組態設定 和特定系統上可用的 預定義變數

phpinfo() 也是一個有價值的除錯工具,因為它包含所有 EGPCS (環境、GET、POST、Cookie、伺服器) 資料。

參數

flags

可藉由在可選的 flags 參數中,傳遞一個或多個以下常數按位元加總的值,來自訂輸出。也可以將各個常數或按位元值與 按位元或運算子結合。

phpinfo() 選項
名稱(常數) 描述
INFO_GENERAL 1 組態行、php.ini 位置、建置日期、Web 伺服器、系統等等。
INFO_CREDITS 2 PHP 貢獻者。另請參閱 phpcredits()
INFO_CONFIGURATION 4 PHP 指示詞目前的本機值和主值。另請參閱 ini_get()
INFO_MODULES 8 載入的模組及其各自的設定。另請參閱 get_loaded_extensions()
INFO_ENVIRONMENT 16 環境變數資訊,也適用於 $_ENV
INFO_VARIABLES 32 顯示來自 EGPCS(環境、GET、POST、Cookie、伺服器)的所有 預定義變數
INFO_LICENSE 64 PHP 授權資訊。另請參閱 » 授權常見問題
INFO_ALL -1 顯示以上所有內容。

回傳值

永遠回傳 true

範例

範例 #1 phpinfo() 範例

<?php

// 顯示所有資訊,預設為 INFO_ALL
phpinfo();

// 只顯示模組資訊。
// phpinfo(8) 產生相同的結果。
phpinfo(INFO_MODULES);

?>

注意事項

注意:

在 PHP 5.5 之前的版本中,當 expose_php 設定設為 off 時,會停用部分顯示的資訊。這包括 PHP 和 Zend 標誌,以及貢獻者資訊。

注意:

使用 CLI 模式時,phpinfo() 會輸出純文字而不是 HTML。

參見

新增筆記

使用者貢獻的筆記 19 則筆記

14
Phelon Dudras
16 年前
一種簡單的方法來設定您自己的 phpinfo() 輸出樣式。

<style type="text/css">
#phpinfo {}
#phpinfo pre {}
#phpinfo a:link {}
#phpinfo a:hover {}
#phpinfo table {}
#phpinfo .center {}
#phpinfo .center table {}
#phpinfo .center th {}
#phpinfo td, th {}
#phpinfo h1 {}
#phpinfo h2 {}
#phpinfo .p {}
#phpinfo .e {}
#phpinfo .h {}
#phpinfo .v {}
#phpinfo .vr {}
#phpinfo img {}
#phpinfo hr {}
</style>

<div id="phpinfo">
<?php

ob_start
() ;
phpinfo () ;
$pinfo = ob_get_contents () ;
ob_end_clean () ;

// anker-tag 的 name 屬性「module_Zend Optimizer」不是 xhtml 有效,所以將它取代為「module_Zend_Optimizer」
echo ( str_replace ( "module_Zend Optimizer", "module_Zend_Optimizer", preg_replace ( '%^.*<body>(.*)</body>.*$%ms', '$1', $pinfo ) ) ) ;

?>
</div>
12
code at adspeed dot com
18 年前
此函式剖析 phpinfo 輸出,以取得有關 PHP 模組的詳細資訊。

<?php
/** 從 phpinfo 解析 PHP 模組 */
function parsePHPModules() {
ob_start();
phpinfo(INFO_MODULES);
$s = ob_get_contents();
ob_end_clean();

$s = strip_tags($s,'<h2><th><td>');
$s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
$s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
$vTmp = preg_split('/(<h2>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
$vModules = array();
for (
$i=1;$i<count($vTmp);$i++) {
if (
preg_match('/<h2>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
$vName = trim($vMat[1]);
$vTmp2 = explode("\n",$vTmp[$i+1]);
foreach (
$vTmp2 AS $vOne) {
$vPat = '<info>([^<]+)<\/info>';
$vPat3 = "/$vPat\s*$vPat\s*$vPat/";
$vPat2 = "/$vPat\s*$vPat/";
if (
preg_match($vPat3,$vOne,$vMat)) { // 3 欄
$vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
} elseif (
preg_match($vPat2,$vOne,$vMat)) { // 2 欄
$vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
}
}
}
}
return
$vModules;
}
?>

範例輸出
[gd] => 陣列
(
[GD 支援] => 已啟用
[GD 版本] => 綑綁 (相容於 2.0.28)
[FreeType 支援] => 已啟用
[FreeType 連結] => 使用 freetype
[FreeType 版本] => 2.1.9
[T1Lib 支援] => 已啟用
[GIF 讀取支援] => 已啟用
[GIF 建立支援] => 已啟用
[JPG 支援] => 已啟用
[PNG 支援] => 已啟用
[WBMP 支援] => 已啟用
[XBM 支援] => 已啟用
)

[date] => 陣列 (
[日期/時間支援] => 已啟用
[時區資料庫版本] => 2005.14
[時區資料庫] => 內部
[預設時區] => 美國/洛杉磯
[指令] => 陣列 (
[0] => 本機值
[1] => 主值
)
[date.timezone] => 陣列 (
[0] => 無值
[1] => 無值
)
)


<?php
/** 取得模組設定 */
function getModuleSetting($pModuleName,$pSetting) {
$vModules = parsePHPModules();
return
$vModules[$pModuleName][$pSetting];
}
?>

範例:getModuleSetting('gd','GD 版本'); 回傳 "bundled (2.0.28 compatible)"
7
cbar at vmait dot com
10 年前
<?php

// 注意:當從上述 phpinfo_array() 存取元素時,你可以這樣做:
$array = phpinfo_array();

// 這會正常運作
echo $array["General"]["System "];

// 這個也應該可以運作,但它沒有,因為陣列中 "System" 後面有一個空格。
echo $array["General"]["System"];

// 我希望程式設計師會修復它,以節省其他人浪費時間。否則,這個腳本不錯。


?>
7
Helpful Harry
19 年前
看看這個酷炫又色彩繽紛的 phpinfo()!

<?php

ob_start
();
phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();

preg_match_all('/#[0-9a-fA-F]{6}/', $phpinfo, $rawmatches);
for (
$i = 0; $i < count($rawmatches[0]); $i++)
$matches[] = $rawmatches[0][$i];
$matches = array_unique($matches);

$hexvalue = '0123456789abcdef';

$j = 0;
foreach (
$matches as $match)
{

$r = '#';
$searches[$j] = $match;
for (
$i = 0; $i < 6; $i++)
$r .= substr($hexvalue, mt_rand(0, 15), 1);
$replacements[$j++] = $r;
unset(
$r);
}

for (
$i = 0; $i < count($searches); $i++)
$phpinfo = str_replace($searches, $replacements, $phpinfo);
echo
$phpinfo;
?>
6
jon at sitewizard dot ca
16 年前
將 phpinfo 的所有資料擷取到巢狀陣列中
<?php
ob_start
();
phpinfo();
$phpinfo = array('phpinfo' => array());
if(
preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER))
foreach(
$matches as $match)
if(
strlen($match[1]))
$phpinfo[$match[1]] = array();
elseif(isset(
$match[3]))
$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
else
$phpinfo[end(array_keys($phpinfo))][] = $match[2];
?>

使用陣列中個別值的一些範例

<?php
echo "系統: {$phpinfo['phpinfo']['System']}<br />\n";
echo
"安全模式: {$phpinfo['PHP Core']['safe_mode'][0]}<br />\n";
echo
"授權: {$phpinfo['PHP License'][0]}<br />\n";
?>

顯示所有資訊

<?php
foreach($phpinfo as $name => $section) {
echo
"<h3>$name</h3>\n<table>\n";
foreach(
$section as $key => $val) {
if(
is_array($val))
echo
"<tr><td>$key</td><td>$val[0]</td><td>$val[1]</td></tr>\n";
elseif(
is_string($key))
echo
"<tr><td>$key</td><td>$val</td></tr>\n";
else
echo
"<tr><td>$val</td></tr>\n";
}
echo
"</table>\n";
}
?>

注意:為了正確擷取所有資料,正規表示式會比對表格標頭和表格資料,導致 'Local Value' 和 'Global Value' 顯示為 'Directive' 條目。
5
jb2386 at hotmail dot com
18 年前
這是對 "code at adspeed dot com" 先前程式碼的輕微修改,可將 PHP 模組擷取為陣列。我在 PHP 4.1.2 上使用它時失敗,因為 <h2> 標籤也有 align="center"。因此,此更新變更了這些標籤的正規表示式。

<?php

/* 從 phpinfo 解析 php 模組 */

function parsePHPModules() {
ob_start();
phpinfo(INFO_MODULES);
$s = ob_get_contents();
ob_end_clean();

$s = strip_tags($s,'<h2><th><td>');
$s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
$s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
$vTmp = preg_split('/(<h2[^>]*>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
$vModules = array();
for (
$i=1;$i<count($vTmp);$i++) {
if (
preg_match('/<h2[^>]*>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
$vName = trim($vMat[1]);
$vTmp2 = explode("\n",$vTmp[$i+1]);
foreach (
$vTmp2 AS $vOne) {
$vPat = '<info>([^<]+)<\/info>';
$vPat3 = "/$vPat\s*$vPat\s*$vPat/";
$vPat2 = "/$vPat\s*$vPat/";
if (
preg_match($vPat3,$vOne,$vMat)) { // 3 欄
$vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
} elseif (
preg_match($vPat2,$vOne,$vMat)) { // 2 欄
$vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
}
}
}
}
return
$vModules;
}
?>
4
keinwort at hotmail dot com
7 年前
備註/資訊:如果 Content-Security-Policy HTTP 標頭

Content-Security-Policy "default-src 'self';";

phpinfo() 將會顯示沒有表格
4
arimbourg at ariworld dot eu
14 年前
這是為了取得 W3C 驗證 (XHTML1.0 Transitional) 所必需的...
phpinfo 的輸出使用該 DTD 宣告
- "系統 ID" 有錯誤的網址可供驗證:"DTD/xhtml1-transitional.dtd" 而不是 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
- 某些模組名稱包含空格,且該函式的輸出使用名稱作為錨點的 ID 和 NAME。這些屬性不能以這種方式驗證 (只能使用唯一名稱)。

<?php

ob_start
();

ob_start (); // 擷取輸出
phpinfo (); // phpinfo ()
$info = trim (ob_get_clean ()); // 輸出

// 如果 ID 和 NAME 屬性存在,則替換其中的空格...
$info = preg_replace ('/(id|name)(=["\'][^ "\']+) ([^ "\']*["\'])/i', '$1$2_$3', $info);

$imp = new DOMImplementation ();
$dtd = $imp->createDocumentType (
'html',
'-//W3C//DTD XHTML 1.0 Transitional//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
);
$doc = $imp->createDocument (
'http://www.w3.org/1999/xhtml',
'html',
$dtd
);
$doc->encoding = 'utf-8';

$info_doc = new DOMDocument ('1.0', 'utf-8');
/* 解析 phpinfo 的輸出
* 使用 @ 運算子避免出現未定義實體的訊息
* 或改用 loadHTML
*/
@$info_doc->loadXML ($info);

$doc->documentElement->appendChild ( // 將 HEAD 元素加入 HTML
$doc->importNode (
$info_doc->getElementsByTagName ('head')->item (0),
true // 包含整個子樹
)
);
$doc->documentElement->appendChild ( // 將 BODY 元素加入 HTML
$doc->importNode (
$info_doc->getElementsByTagName ('body')->item (0),
true // 包含整個子樹
)
);

// 現在您得到乾淨的輸出,並且可以進行驗證...
/*
echo ($doc->saveXML ());
// 或
echo ($doc->saveHTML ());
*/

// 這樣可以輕鬆添加一些樣式宣告:
$style = $doc->getElementsByTagName ('style')->item (0);
$style->appendChild (
$doc->createTextNode (
'/* 一些要加入函數輸出的新 CSS 規則 */'
)
);

// 添加更多要顯示的資訊:
$body = $doc->getElementsByTagName ('body')->item (0);
$element = $doc->createElement ('p');
$element->appendChild (
$doc->createTextNode (
'一些要顯示的新內容'
)
);
$body->appendChild ($element);

// 添加新的標頭:
$head = $doc->getElementsByTagName ('head')->item (0);
$meta = $doc->createElement ('meta');
$meta->setAttribute ('name', 'author');
$meta->setAttribute ('content', 'arimbourg at ariworld dot eu');
$head->appendChild ($meta);

// 根據您的需求,取得其餘的輸出並加入以進行除錯
$out = ob_get_clean ();

$pre = $doc->createElement ('div'); // 或 pre
$pre->setAttribute ('style', 'white-space: pre;'); // 對於 div 元素,使用 pre 無效
$pre->appendChild ($doc->createTextNode ($out));
$body->appendChild ($pre);

$doc->formatOutput = true; // 為了良好的縮排
$doc->saveXML ();

?>

所有這些都可以只用 RegExp 完成,但我更喜歡使用 DOM 來操作文件
4
yurkins
16 年前
非常感謝 Mardy dot Hutchinson at gmail dot com
非常好!

一些修正以更正結果顯示
1. 我們需要修剪 $matches[1],因為可能會有空行;
2. 移除 <body> 標籤也不錯,因為其樣式無法正確應用...
3. ...並稍微更改樣式(移除 "body" 選擇器)

我們需要更改兩行

<?php
preg_match
('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);
?>
改為
<?php
preg_match
('%<style type="text/css">(.*?)</style>.*?<body>(.*?)</body>%s', ob_get_clean(), $matches);
?>



<?php
preg_split
( '/\n/', $matches[1] )
?>
改為
<?php
preg_split
( '/\n/', trim(preg_replace( "/\nbody/", "\n", $matches[1])) )
?>

就這樣!現在我們對 phpinfo() 有了一個真正靈活的補充;
1
alec dot hewitt at gmail dot com
1 年前
簡單的 JS 片段,可使用重新命名的樣式內嵌列印 phpinfo()。因此,不會影響容器頁面,並且看起來很美觀。

<script>
document.write(`<div id="phpinfo"><?php phpinfo(61) ?></div>`);
var x = document.querySelector('#phpinfo > style');
x.innerText = x.innerText.replaceAll('\n', '#phpinfo ');
</script>
2
Ken
12 年前
嗨。

這是我將 php_info 儲存到陣列中的版本

<?php
function phpinfo_array()
{
ob_start();
phpinfo();
$info_arr = array();
$info_lines = explode("\n", strip_tags(ob_get_clean(), "<tr><td><h2>"));
$cat = "General";
foreach(
$info_lines as $line)
{
// new cat?
preg_match("~<h2>(.*)</h2>~", $line, $title) ? $cat = $title[1] : null;
if(
preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$info_arr[$cat][$val[1]] = $val[2];
}
elseif(
preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$info_arr[$cat][$val[1]] = array("local" => $val[2], "master" => $val[3]);
}
}
return
$info_arr;
}

// example:
echo "<pre>".print_r(phpinfo_array(), 1)."</pre>";
?>
1
LewisR
9 年前
在 SimonD 的優雅範例基礎上,為了隱藏登入的使用者名稱和密碼(否則會以純文字顯示),以下程式碼應該適用於 PHP 5.4+

<?php
// 開始輸出緩衝
ob_start();

// 發送 phpinfo 內容
phpinfo();

// 取得 phpinfo 內容
$html = ob_get_contents();

// 清空輸出緩衝區
ob_end_clean();

// 移除驗證資料
if ( isset( $_SERVER[ 'PHP_AUTH_USER' ] ) ) $html = str_replace( $_SERVER[ 'PHP_AUTH_USER' ], '[ 已保護 ]' , $html);
if ( isset(
$_SERVER[ 'PHP_AUTH_PW' ] ) ) $html = str_replace( $_SERVER[ 'PHP_AUTH_PW' ], '[ 已保護 ]' , $html);

echo
$html;
?>

若要移除其他項目,只需如上述方式添加即可。
1
SimonD
11 年前
從 phpinfo 輸出中移除敏感資料,如 AUTH_USER 和 AUTH_PASSWORD。

<?php
// 開始輸出緩衝
ob_start();

// 發送 phpinfo 內容
phpinfo();

// 取得 phpinfo 內容
$html = ob_get_contents();

// 清空輸出緩衝區
ob_end_clean();

// 移除驗證資料
if (isset($_SERVER['AUTH_USER'])) $html = str_replace($_SERVER['AUTH_USER'], '<i>無值</i>', $html);
if (isset(
$_SERVER['AUTH_PASSWORD'])) $html = str_replace($_SERVER['AUTH_PASSWORD'], '<i>無值</i>', $html);

echo
$html;
0
Calin S.
9 年前
在閱讀和嘗試各種函數後,我找不到一個能正確解析所有配置、移除任何剩餘 HTML 標籤並將特殊字元轉換為 UTF8 的函數(例如,將 &#039; 轉換為 '),所以我透過改進現有的函數建立了自己的函數。

function phpinfo2array() {
$entitiesToUtf8 = function($input) {
// https://php.dev.org.tw/manual/en/function.html-entity-decode.php#104617
return preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $input);
};
$plainText = function($input) use ($entitiesToUtf8) {
return trim(html_entity_decode($entitiesToUtf8(strip_tags($input))));
};
$titlePlainText = function($input) use ($plainText) {
return '# '.$plainText($input);
};

ob_start();
phpinfo(-1);

$phpinfo = array('phpinfo' => array());

// 移除 <h1>Configuration</h1> 標籤之後的所有內容(其他 h1 標籤)
if (!preg_match('#(.*<h1[^>]*>\s*Configuration.*)<h1#s', ob_get_clean(), $matches)) {
return array();
}

$input = $matches[1];
$matches = array();

if(preg_match_all(
'#(?:<h2.*?>(?:<a.*?>)?(.*?)(?:<\/a>)?<\/h2>)|'.
'(?:<tr.*?><t[hd].*?>(.*?)\s*</t[hd]>(?:<t[hd].*?>(.*?)\s*</t[hd]>(?:<t[hd].*?>(.*?)\s*</t[hd]>)?)?</tr>)#s',
$input,
$matches,
PREG_SET_ORDER
)) {
foreach ($matches as $match) {
$fn = strpos($match[0], '<th') === false ? $plainText : $titlePlainText;
if (strlen($match[1])) {
$phpinfo[$match[1]] = array();
} elseif (isset($match[3])) {
$keys1 = array_keys($phpinfo);
$phpinfo[end($keys1)][$fn($match[2])] = isset($match[4]) ? array($fn($match[3]), $fn($match[4])) : $fn($match[3]);
} else {
$keys1 = array_keys($phpinfo);
$phpinfo[end($keys1)][] = $fn($match[2]);
}

}
}

return $phpinfo;
}

輸出看起來像這樣(請注意,標頭也會包含在內,但會加上 '# ' 前綴,例如 '# Directive')

Array
(
[phpinfo] => Array
(
[0] => PHP 版本 5.6.5
[System] => Darwin Calins-MBP 15.0.0 Darwin Kernel Version 15.0.0: Wed Aug 26 19:41:34 PDT 2015; root:xnu-3247.1.106~5/RELEASE_X86_64 x86_64
[Build Date] => Feb 19 2015 18:34:18
[Registered Stream Socket Transports] => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls, tlsv1.0
[Registered Stream Filters] => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
[1] => 此程式使用 Zend Scripting Language Engine:Zend Engine...
)

[apache2handler] => Array
(
[Apache Version] => Apache/2.4.16 (Unix) PHP/5.6.5 OpenSSL/0.9.8zg
[Apache API Version] => 20120211
[Server Administrator] => webmaster@dummy-host2.example.com
[Hostname:Port] => sitestacker.local:0
[# Directive] => Array
(
[0] => # 本機值
[1] => # 主值
)

[engine] => Array
(
[0] => 1
[1] => 1
)

[last_modified] => Array
(
[0] => 0
[1] => 0
)
0
Mardy dot Hutchinson at gmail dot com
17 年前
將 phpinfo 嵌入到已具有樣式資訊的頁面中

phpinfo 輸出會被包裝在 <div class='phpinfodisplay'> 內,而且我們將 phpinfo() 建立的所有樣式選取器設為私有。

是的,我們在準備選取器列表時作弊了。

<?php
ob_start
();
phpinfo();

preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);

# $matches [1]; # 樣式資訊
# $matches [2]; # Body 資訊

echo "<div class='phpinfodisplay'><style type='text/css'>\n",
join( "\n",
array_map(
create_function(
'$i',
'return ".phpinfodisplay " . preg_replace( "/,/", ",.phpinfodisplay ", $i );'
),
preg_split( '/\n/', $matches[1] )
)
),
"</style>\n",
$matches[2],
"\n</div>\n";
?>

也許有一天 phpinfo() 函數會被修改,以便自行輸出這樣安全的字串。
0
Andrew dot Boag at catalyst dot net dot nz
17 年前
關於上述用於清理 phpinfo() HTML 並將其放入陣列資料結構的函數,有一點注意事項。為了捕捉所有的資訊片段,必須調整 preg_match_all,以處理 2 欄和 3 欄的表格。

我已在此處變更 preg_match_all(),使最後的 <td></td> 變為可選。

<?php
function parsePHPConfig() {
ob_start();
phpinfo(-1);
$s = ob_get_contents();
ob_end_clean();
$a = $mtc = array();
if (
preg_match_all('/<tr><td class="e">(.*?)<\/td><td class="v">(.*?)<\/td>(:?<td class="v">(.*?)<\/td>)?<\/tr>/',$s,$mtc,PREG_SET_ORDER))
foreach(
$mtc as $v){
if(
$v[2] == '<i>no value</i>') continue;
$a[$v[1]] = $v[2];
}
}
return
$a;
}
?>
-1
Joseph Reilly
9 年前
關於「jon at sitewizard dot ca」提供的非常有用的範例,有一點注意事項。
以下陳述
陳述 1
$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
陳述 2
$phpinfo[end(array_keys($phpinfo))][] = $match[2];

這兩行會產生「Strict Standards:Only variables should be passed by reference in...」錯誤。錯誤的根源在於 end() 函數的不正確使用。程式碼可以執行,但會拋出上述錯誤。
要解決此問題,請嘗試使用以下陳述

陳述 1 的修訂
$keys = array_keys($phpinfo);
$phpinfo[end($keys)][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];

陳述 2 的修訂
$keys = array_keys($phpinfo);
$phpinfo[end($keys)][] = $match[2];

這樣可以修正錯誤。
為了將所有內容包含在一個範例中
<?php
function quick_dev_insights_phpinfo() {
ob_start();
phpinfo(11);
$phpinfo = array('phpinfo' => array());

if(
preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)){
foreach(
$matches as $match){
if(
strlen($match[1])){
$phpinfo[$match[1]] = array();
}elseif(isset(
$match[3])){
$keys1 = array_keys($phpinfo);
$phpinfo[end($keys1)][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
}else{
$keys1 = array_keys($phpinfo);
$phpinfo[end($keys1)][] = $match[2];

}

}
}

if(! empty(
$phpinfo)){
foreach(
$phpinfo as $name => $section) {
echo
"<h3>$name</h3>\n<table class='wp-list-table widefat fixed pages'>\n";
foreach(
$section as $key => $val){
if(
is_array($val)){
echo
"<tr><td>$key</td><td>$val[0]</td><td>$val[1]</td></tr>\n";
}elseif(
is_string($key)){
echo
"<tr><td>$key</td><td>$val</td></tr>\n";
}else{
echo
"<tr><td>$val</td></tr>\n";
}
}
}
echo
"</table>\n";
}else{
echo
"<h3>Sorry, the phpinfo() function is not accessable. Perhaps, it is disabled<a href='https://php.dev.org.tw/manual/en/function.phpinfo.php'>See the documentation.</a></h3>";
}
}
?>
坦白說,我之所以費心添加這個註解,是因為「jon at sitewizard dot ca」的範例可能是網路上最好的範例,而且我認為它拋出錯誤是很不幸的。希望這對某些人有用。
-3
neo_selen
12 年前
您可以在這裡注意到,phpinfo 的這些數值
與二進位系統中的某些事物相似

-1,以 7 位數編碼
111 1111

看看這個
1+2+4+8+16+32+64=127

無號數,127 是
111 1111

因此,請看一下這個:取得所有功能的方法是將它們全部加起來。零表示沒有任何東西。-1 表示全部。
因此,您可以使用負數傳遞選項。
例如
<?php phpinfo(48) ?>
也等於
<?php phpinfo(-80) ?>
48 = 32 + 16
-80= 0 - 64 - 8 - 4 - 2 - 1

因此,您可以在負數模式下看到它像這樣
不是沒有任何東西
不是全部 (-1),別忘了!
不是選項 64
不是選項 8
不是選項 4
不是選項 2

因此,如果您不想要選項 8,這樣做會很好
不是沒有任何東西 (0)
不是全部 (-1)
不是選項 8 (-1)
您得到
<?php phpinfo(-9); ?>

希望這會很有用,這是我第 1 次發文 ^^
-4
webmaster at askapache dot com
15 年前
我想要一個簡單的 *函數*,將 phpinfo 的輸出轉換為陣列。這是我根據先前許多作者的提示和原始程式碼:php-5.2.6/ext/standard/info.c 所想出來的。

像 phpinfo_array() 一樣呼叫此函數,會印出陣列,phpinfo_array(1) 會傳回陣列以供您自行處理。

== 範例輸出 ==
[PHP Configuration] => Array
(
[PHP Version] => 5.2.6
[PHP Egg] => PHPE9568F34-D428-11d2-A769-00AA001ACF42
[System] => Linux askapache 2.6.22.19-grsec3
[Build Date] => Nov 11 2008 13:09:07
[Configure Command] => ./configure --prefix=/home/grsec/bin/php
[Server API] => FastCGI

[IPv6 Support] => enabled
[Zend Egg] => PHPE9568F35-D428-11d2-A769-00AA001ACF42
[PHP Credits Egg] => PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
)

[mbstring] => Array
(
[mbstring.http_input] => pass
[mbstring.internal_encoding] => Array
(
[0] => ISO-8859-1
[1] => 無值
)

[mbstring.language] => neutral
)

[mcrypt] => Array
(
[Version] => 3.5.7
[Api No] => 20031217
)

<?php
function phpinfo_array($return=false){
/* Andale! Andale! Yee-Hah! */
ob_start();
phpinfo(-1);

$pi = preg_replace(
array(
'#^.*<body>(.*)</body>.*$#ms', '#<h2>PHP License</h2>.*$#ms',
'#<h1>Configuration</h1>#', "#\r?\n#", "#</(h1|h2|h3|tr)>#", '# +<#',
"#[ \t]+#", '#&nbsp;#', '# +#', '# class=".*?"#', '%&#039;%',
'#<tr>(?:.*?)" src="(?:.*?)=(.*?)" alt="PHP Logo" /></a>'
.'<h1>PHP Version (.*?)</h1>(?:\n+?)</td></tr>#',
'#<h1><a href="(?:.*?)\?=(.*?)">PHP Credits</a></h1>#',
'#<tr>(?:.*?)" src="(?:.*?)=(.*?)"(?:.*?)Zend Engine (.*?),(?:.*?)</tr>#',
"# +#", '#<tr>#', '#</tr>#'),
array(
'$1', '', '', '', '</$1>' . "\n", '<', ' ', ' ', ' ', '', ' ',
'<h2>PHP Configuration</h2>'."\n".'<tr><td>PHP Version</td><td>$2</td></tr>'.
"\n".'<tr><td>PHP Egg</td><td>$1</td></tr>',
'<tr><td>PHP Credits Egg</td><td>$1</td></tr>',
'<tr><td>Zend Engine</td><td>$2</td></tr>' . "\n" .
'<tr><td>Zend Egg</td><td>$1</td></tr>', ' ', '%S%', '%E%'),
ob_get_clean());

$sections = explode('<h2>', strip_tags($pi, '<h2><th><td>'));
unset(
$sections[0]);

$pi = array();
foreach(
$sections as $section){
$n = substr($section, 0, strpos($section, '</h2>'));
preg_match_all(
'#%S%(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?%E%#',
$section, $askapache, PREG_SET_ORDER);
foreach(
$askapache as $m)
$pi[$n][$m[1]]=(!isset($m[3])||$m[2]==$m[3])?$m[2]:array_slice($m,2);
}

return (
$return === false) ? print_r($pi) : $pi;
}

?>
To Top