PHP Conference Japan 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);

?>

注释

注意:

在 5.5 之前的 PHP 版本中,当 expose_php 配置设置设置为 off 时,显示的信息的一部分会被禁用。这包括 PHP 和 Zend 徽标以及版权信息。

注意:

phpinfo() 在使用 CLI 模式时输出纯文本而不是 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 Support] => 已启用
[GD Version] => 内置 (兼容 2.0.28)
[FreeType Support] => 已启用
[FreeType Linkage] => 使用 freetype
[FreeType Version] => 2.1.9
[T1Lib Support] => 已启用
[GIF Read Support] => 已启用
[GIF Create Support] => 已启用
[JPG Support] => 已启用
[PNG Support] => 已启用
[WBMP Support] => 已启用
[XBM Support] => 已启用
)

[date] => 数组 (
[date/time support] => 已启用
[Timezone Database Version] => 2005.14
[Timezone Database] => 内部
[Default timezone] => America/Los_Angeles
[Directive] => 数组 (
[0] => 本地值
[1] => 主值
)
[date.timezone] => 数组 (
[0] => 无值
[1] => 无值
)
)


<?php
/** 获取模块设置 */
function getModuleSetting($pModuleName,$pSetting) {
$vModules = parsePHPModules();
return
$vModules[$pModuleName][$pSetting];
}
?>

例如:getModuleSetting('gd','GD Version'); 返回 "内置 (兼容 2.0.28)"
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";
}
?>

注意:为了正确检索所有数据,正则表达式匹配表头和表格数据,导致“本地值”和“全局值”显示为“指令”条目。
5
[email protected]
18 年前
这是对之前“[email protected]”编写的代码的略微修改,该代码将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
[email protected]
7年前
备注/信息:如果Content-Security-Policy HTTP头

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

phpinfo()将显示为无表格。
4
[email protected]
14年前
这对于获得W3C验证(XHTML1.0过渡型)是必要的……
phpinfo的输出已使用该DTD声明
- “系统ID”的验证URL错误:“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 ();

?>

所有这些都可以只用正则表达式来完成,但我更喜欢使用 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)
{
// 新的类别?
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;
}

// 例子:
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' ], '[ protected ]' , $html);
if ( isset(
$_SERVER[ 'PHP_AUTH_PW' ] ) ) $html = str_replace( $_SERVER[ 'PHP_AUTH_PW' ], '[ protected ]' , $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>no value</i>', $html);
if (isset(
$_SERVER['AUTH_PASSWORD'])) $html = str_replace($_SERVER['AUTH_PASSWORD'], '<i>no value</i>', $html);

echo
$html;
0
Calin S.
9年前
在阅读和尝试了各种函数后,我找不到一个能够正确解析所有配置、去除任何剩余的 html 标签并将特殊字符转换为 UTF8(例如将 &#039; 转换为 ')的函数,因此我通过改进现有的函数创建了自己的函数

function phpinfo2array() {
$entitiesToUtf8 = function($input) {
// https://php.net/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')

数组
(
[phpinfo] => 数组
(
[0] => PHP 版本 5.6.5
[系统] => Darwin Calins-MBP 15.0.0 Darwin 内核版本 15.0.0:Wed Aug 26 19:41:34 PDT 2015;root:xnu-3247.1.106~5/RELEASE_X86_64 x86_64
[构建日期] => 2015年2月19日 18:34:18
[已注册的流套接字传输] => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls, tlsv1.0
[已注册的流过滤器] => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
[1] => 此程序使用了 Zend 脚本语言引擎:Zend Engine...
)

[apache2handler] => 数组
(
[Apache 版本] => Apache/2.4.16 (Unix) PHP/5.6.5 OpenSSL/0.9.8zg
[Apache API 版本] => 20120211
[服务器管理员] => [email protected]
[主机名:端口] => sitestacker.local:0
[# 指令] => 数组
(
[0] => # 本地值
[1] => # 主值
)

[engine] => 数组
(
[0] => 1
[1] => 1
)

[last_modified] => 数组
(
[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]; # 主体信息

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>抱歉,phpinfo() 函数无法访问。也许它被禁用了<a href='https://php.net/manual/en/function.phpinfo.php'>查看文档。</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); ?>

希望这会有用,这是我的第一篇文章 ^^
-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){
/* 加油!加油!耶哈! */
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 配置</h2>'."\n".'<tr><td>PHP 版本</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 引擎</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