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。

参见

添加注释

用户贡献的注释 21 个注释

14
Phelon Dudras
15 年前
一种对您的 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 () ;

// 锚点标签的 "module_Zend Optimizer" 属性不符合 xhtml 规范,因此将其替换为 "module_Zend_Optimizer"
echo ( str_replace ( "module_Zend Optimizer", "module_Zend_Optimizer", preg_replace ( '%^.*<body>(.*)</body>.*$%ms', '$1', $pinfo ) ) ) ;

?>
</div>
9
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)) { // 3cols
$vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
} elseif (
preg_match($vPat2,$vOne,$vMat)) { // 2cols
$vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
}
}
}
}
return
$vModules;
}
?>

示例输出
[gd] => Array
(
[GD 支持] => enabled
[GD 版本] => bundled (2.0.28 compatible)
[FreeType 支持] => enabled
[FreeType 链接] => with freetype
[FreeType 版本] => 2.1.9
[T1Lib 支持] => enabled
[GIF 读取支持] => enabled
[GIF 创建支持] => enabled
[JPG 支持] => enabled
[PNG 支持] => enabled
[WBMP 支持] => enabled
[XBM 支持] => enabled
)

[date] => Array (
[date/time 支持] => enabled
[时区数据库版本] => 2005.14
[时区数据库] => internal
[默认时区] => America/Los_Angeles
[指令] => Array (
[0] => 本地值
[1] => 主值
)
[date.timezone] => Array (
[0] => no value
[1] => no value
)
)


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

示例:getModuleSetting('gd','GD 版本'); 返回 "bundled (2.0.28 compatible)"
7
Helpful Harry
18 年前
看看这个酷炫而充满活力的 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;
?>
5
cbar at vmait dot com
10 年前
<?php

// 注意:访问上面 phpinfo_array() 中的元素时,可以这样做:
$array = phpinfo_array();

// 这将起作用
echo $array["General"]["System "];

// 这也应该起作用,但它不起作用,因为数组中 System 后面有一个空格。
echo $array["General"]["System"];

// 我希望编码人员会修复它,这样可以节省其他人浪费时间。 否则,不错的脚本。


?>
5
jb2386 at hotmail dot com
17 年前
这是对之前 “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;
}
?>
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>
4
yurkins
16 年前
非常感谢 Mardy dot Hutchinson at gmail dot com
非常好!

一些修复以修正结果显示
1. 我们需要对 $matches [1] 进行 trim 操作,因为它可能包含空行;
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() 扩展;
4
arimbourg at ariworld dot eu
13 年前
这是为了获得 W3C 验证(XHTML1.0 Transitional)...
phpinfo 的输出声明了该 DTD
- "System 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 来操作文档
5
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']['系统']}<br />\n";
echo
"安全模式: {$phpinfo['PHP 内核']['safe_mode'][0]}<br />\n";
echo
"许可证: {$phpinfo['PHP 许可证'][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";
}
?>

注意:为了正确检索所有数据,正则表达式匹配表头和表格数据,导致“本地值”和“全局值”显示为“指令”条目。
2
keinwort at hotmail dot com
6 年前
备注/信息:如果 Content-Security-Policy HTTP 头

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

phpinfo() 将显示为不带表格
1
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>";
?>
0
Calin S.
8 年前
在阅读和尝试了各种函数后,我找不到一个能够正确解析所有配置、去除所有剩余的 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')

Array
(
[phpinfo] => Array
(
[0] => PHP Version 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] => This program makes use of the 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] => [email protected]
[Hostname:Port] => sitestacker.local:0
[# Directive] => Array
(
[0] => # Local Value
[1] => # Master Value
)

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

[last_modified] => Array
(
[0] => 0
[1] => 0
)
0
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
Andrew dot Boag at catalyst dot net dot nz
16 年前
关于上面用于清理 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
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;
?>

要删除其他项目,只需按照上述方式添加即可。
-2
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” 的示例可能是网络上最好的,并且认为它会抛出错误是件不幸的事。 希望这对某些人有用。
-2
Mardy dot Hutchinson at gmail dot com
16 年前
将 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() 函数会被修改成自己输出一个安全字符串。
-4
webmaster at askapache dot com
15 年前
我想要一个简单的 *函数* 将 phpinfo 的输出转换为数组。 这是我得益于之前很多作者的提示和源文件:php-5.2.6/ext/standard/info.c 得出的结果。

像 phpinfo_array() 这样调用此函数将打印数组,phpinfo_array(1) 将返回数组以供您自己处理。

== 示例输出 ==
[PHP 配置] => 数组
(
[PHP 版本] => 5.2.6
[PHP Egg] => PHPE9568F34-D428-11d2-A769-00AA001ACF42
[系统] => Linux askapache 2.6.22.19-grsec3
[构建日期] => 2008 年 11 月 11 日 13:09:07
[配置命令] => ./configure --prefix=/home/grsec/bin/php
[服务器 API] => FastCGI

[IPv6 支持] => 已启用
[Zend Egg] => PHPE9568F35-D428-11d2-A769-00AA001ACF42
[PHP Credits Egg] => PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
)

[mbstring] => 数组
(
[mbstring.http_input] => pass
[mbstring.internal_encoding] => 数组
(
[0] => ISO-8859-1
[1] => no value
)

[mbstring.language] => neutral
)

[mcrypt] => 数组
(
[版本] => 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;
}

?>
-5
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); ?>

希望这会很有用,这是我的第一篇帖子 ^^
-7
henzeberkheij at dot SPAM dot gmail dot com
11 年前
我需要一种方法来快速滚动浏览 phpinfo,它是一个很大的信息列表。 所以它就在这里。 在顶部有一个带有部分的列表,新加载的扩展部分将包含指向加载的模块的锚点的链接。 会话变量部分将显示当前加载的会话。 它使用 Domdocument 进行操作,因此您应该加载它
<?php
ob_start
();
$exts = get_loaded_extensions();
phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();
//print $phpinfo;
$html_str = $phpinfo;
$html = new DOMDocument();
$html->loadHTML($html_str);
$title = $html->getElementsByTagName("title")->item(0);
$title->nodeValue = "PHP Version ".phpversion();
$body = $html->getElementsByTagName("body")->item(0);

$body->setAttribute("style", "background-color:beige;");
$table = $body = $html->getElementsByTagName("table")->item(3)->nextSibling;
$head = $html->getElementsByTagName("table")->item(0)->nextSibling;
ob_start();
?>
<h2><a name="session_variables">Session variables</a></h2>
<table border="0" cellpadding="2" width="600">
<tr class="h"><th>Variables</th><th>Value</th></tr>
<?php foreach($_SESSION as $key=>$value){
if(
is_bool($value)){
$value = ($value)?"true":"false";
}else if(
is_array($value)){
$value = '<pre>'.print_r($value, true).'</pre>';
}else if(empty(
$value) && $value != "0"){
$value = "<i>no value</i>";
}
?>
<tr>
<td class="e"><?=$key?></td>
<td class="v"><?=$value?></td>
</tr>
<?php
}
?>
</table>

<h2><a name="loaded_extensions">loaded extensions</a></h2>
<table border="0" cellpadding="2" width="600">
<tr class="h"><th>Extension</th><th>Version</th></tr>
<?php

natcasesort
($exts);
foreach(
$exts as $value){
$version = phpversion($value);
?>
<tr>
<td class="e" style="width:150px;"><a href="#module_<?=$value?>" style="color:black; background-color:#ccccff;"><?=$value?></a></td>
<td class="v"><?=(!empty($version))?$version:"<i>Unknown</i>" ?></td>
</tr>
<?php
}
?>
</table><br />
<?php
$txt_str
= ob_get_contents();
ob_end_clean();
$txt = new DOMDocument();
$txt->loadHTML($txt_str);
$txt_body = $txt->getElementsByTagName("body")->item(0);

foreach(
$txt_body->childNodes as $child){
$child = $html->importNode($child, true);
$table->parentNode->insertBefore($child, $table);
}

$h2 = $html->getElementsByTagName("h2");
foreach(
$h2 as $item){
if(
$item->getElementsByTagName("a")->length == 0){
$value = $item->nodeValue;
$item->nodeValue = "";
$a = $html->createElement("a");
$a->setAttribute("name", strtolower(str_replace(" ", "_", $value)));
$a->nodeValue = $value;
$item->appendChild($a);
}
$a = $item->getElementsByTagName("a")->item(0);

if(!
in_array($a->nodeValue, $exts)){
$menu[strtolower(str_replace(" ", "_", $a->nodeValue))] = $a->nodeValue;
}
$top_a = $html->createElement("a");
if(!
in_array($a->nodeValue, $exts)){
$txt = $html->createTextNode("(Go to top)");
$top_a->appendChild($txt);
$top_a->setAttribute("href", "#");
}else{
$txt = $html->createTextNode("(Go to extensionlist)");
$top_a->appendChild($txt);
$top_a->setAttribute("href", "#loaded_extensions");
}
$top_a->setAttribute("style", "background-color:beige; font-size:12px; margin-left:5px; margin-top:-5px; color:black;");
$item->appendChild($top_a);
}
ob_start();
?>
<br />
<table border="0" cellpadding="2" width="600">
<tr class="h"><th colspan="2">Sections</th></tr>
<tr>
<?php
$i
= 0;
foreach(
$menu as $key=>$item){
print
"<td class='v'><a href='#$key' style='background-color:#cccccc; color:black;'>$item</a></td>";
if(
$i%2){
print
'</tr><tr>';
}
$i++;
}
if(
$i%2){
print
'<td class="v"></td>';
}
?>
</tr>
</table>

<?php
$txt_str
= ob_get_clean();
$txt = new DOMDocument();
$txt->loadHTML($txt_str);
$txt_body = $txt->getElementsByTagName("body")->item(0);
foreach(
$txt_body->childNodes as $child){
$child = $html->importNode($child, true);
$table->parentNode->insertBefore($child, $head);
}
print
$html->saveHTML();
?>
-17
bimal at sanjaal dot com
6 年前
如果您将函数的输出嵌入到页面中,<html> 标签可能会发生冲突,导致页面变形。

相反,重要的是只提取<body> 和 </body> 标签之间的内容。以下是方法。

<?php
public function info()
{
ob_start();
phpinfo();
$info = ob_get_clean();

$info = preg_replace("/^.*?\<body\>/is", "", $info);
$info = preg_replace("/<\/body\>.*?$/is", "", $info);

echo
$info;
}
?>
To Top