Есть ли способ заставить phpinfo () выводить свои материалы без форматирования. Так же, как в режиме CLI?

но, конечно, в обычном режиме не CLI. Форматированный вывод, включенный среди других HTML, уничтожает существующий макет веб-страницы.

3 ответов


есть несколько хороших примеров преобразования информации в массив на PHP.net сайт.

вот лучший пример. Вы можете пройти через этот массив, чтобы отобразить его так, как вам захочется.


Я только что закончил создание композитор библиотека для этой цели. Прямо сейчас он может анализировать вывод 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.

этой функции делает большую работу по преобразованию 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></info>', $s);
    $s = preg_replace('/<td[^>]*>([^<]+)<\/td>/', '<info></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;
}