但当然在正常模式下不是 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>
或者根据需要以其他方式进行后期处理