有没有办法强制phpinfo()在不格式化的情况下输出它的东西.就像在 CLI 模式下一样


Is there a way to force phpinfo() to output its stuff without formatting. Just like in CLI mode?

但当然在正常模式下不是 CLI。其他 HTML 中包含的格式化输出会破坏现有的网页布局。

这个函数在将phpinfo转换为数组方面做得很好。

function parse_phpinfo() {
    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);
    $t = preg_split('/(<h2[^>]*>[^<]+<'/h2>)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE);
    $r = array(); $count = count($t);
    $p1 = '<info>([^<]+)<'/info>';
    $p2 = '/'.$p1.''s*'.$p1.''s*'.$p1.'/';
    $p3 = '/'.$p1.''s*'.$p1.'/';
    for ($i = 1; $i < $count; $i++) {
        if (preg_match('/<h2[^>]*>([^<]+)<'/h2>/', $t[$i], $matchs)) {
            $name = trim($matchs[1]);
            $vals = explode("'n", $t[$i + 1]);
            foreach ($vals AS $val) {
                if (preg_match($p2, $val, $matchs)) { // 3cols
                    $r[$name][trim($matchs[1])] = array(trim($matchs[2]), trim($matchs[3]));
                } elseif (preg_match($p3, $val, $matchs)) { // 2cols
                    $r[$name][trim($matchs[1])] = trim($matchs[2]);
                }
            }
        }
    }
    return $r;
}

我刚刚为此目的完成了创建作曲家库。现在,当从命令行调用时,它可以解析phpinfo()输出,这是我的用例。

我没有使用 strip_tags() 或任何聪明的技巧,我只是从原始函数所做的一切中向后工作。

您可以像这样使用该库:

<?php
include_once('vendor/autoload.php');
ob_start();
phpinfo();
$phpinfoAsString = ob_get_contents();
ob_get_clean();
$phpInfo = new OutCompute'PHPInfo'PHPInfo();
$phpInfo->setText($phpinfoAsString);
var_export($phpInfo->get());
?>

您可以在模块内和其他地方访问密钥:

echo $phpInfoArray['Configuration']['bz2']['BZip2 Support']; # Will output 'Enabled' if enabled

echo $phpInfoArray['Thread Safety'] # Will output 'disabled' if disabled.

PHP.net 站点上有一些将信息转换为数组的很好的例子。

这是最好的例子。您可以遍历该数组以以您想要的任何方式显示它。

如果您的主机允许您使用 exec()您可以像这样输出它,就像在 CLI 上一样:

<?php
exec('php -i', $data);
var_dump($data);

请注意,这将显示与 CLI 上相同的信息,它对 Web 服务器一无所知。

phpinfo() 有自己的原生无格式输出:

php -r 'phpinfo();'

在"正常"模式下,我认为您在 php 文档中的意思是您可以这样评估它:

$phpinfo = shell_exec("php -r 'phpinfo();'");

然后将其包装在 pre 标记中以显示换行符,或使用 nl2br():

<pre><?= $phpinfo ?></pre>

或者根据需要以其他方式进行后期处理