Как отобразить PHP скрипты? Практические методы

Раздел: Инструменты разработки -> Отладка

Способы отображения PHP кода для отладки

Как подсветить и показать исходный код PHP файла непосредственно в браузере?

Наиболее удобный метод - использование встроенной функции highlight_file(). Она читает указанный файл и выводит его с подсветкой синтаксиса, встроенной цветовой схемой PHP. Этот способ подходит для быстрой проверки кода на сервере, когда нужен наглядный просмотр без установки дополнительных инструментов.

Пример простейшего скрипта:

<?php
highlight_file('index.php');
?>

Если файл находится в той же директории, достаточно указать его имя. Для абсолютного пути используйте, например, /var/www/html/index.php.

Типичные ошибки:

  • Файл не найден - проверьте путь и права доступа.
  • Нет прав на чтение - настройте права через chmod или используйте корректного владельца.
  • Вывод может конфликтовать с заголовками - вызывайте функцию до любого вывода (или используйте буферизацию).

Решение: оберните вызов в буферизацию:

<?php
ob_start();
highlight_file('example.php');
$output = ob_get_clean();
echo $output;
?>

Цель: быстрый просмотр кода прямо на сервере с подсветкой. Используется при отладке, ревью кода, обучении.

Как вывести сырой код PHP без подсветки?

Иногда требуется увидеть исходный текст без стилизации - например, для копирования или анализа содержимого. Для этого подходит комбинация file_get_contents() и htmlspecialchars().

<?php
$code = file_get_contents('config.php');
echo '<pre>' . htmlspecialchars($code) . '</pre>';
?>

Функция htmlspecialchars() преобразует специальные символы (например, < и >) в HTML-сущности, чтобы браузер не интерпретировал код.

Типичные проблемы:

  • Большие файлы могут потреблять много памяти - используйте построчное чтение.
  • Нет прав на чтение - обрабатывайте ошибку через @ или проверку file_exists().

Решение для больших файлов:

<?php
$handle = fopen('large.php', 'r');
if ($handle) {
    echo '<pre>';
    while (($line = fgets($handle)) !== false) {
        echo htmlspecialchars($line);
    }
    echo '</pre>';
    fclose($handle);
}
?>

Цель: получить точный текст файла для дальнейшего анализа или автоматической обработки.

Как заставить сервер отдавать PHP-файлы как обычный текст?

Этот вариант используется редко, но может быть полезен для временного доступа к коду без написания дополнительного скрипта. Настройка производится через файл .htaccess (Apache) или конфигурацию nginx.

Пример для Apache:

# .htaccess в директории с файлами
RemoveHandler .php
AddType text/plain .php

После этого при обращении к любому .php файлу браузер отобразит его исходный код. Внимание: эта настройка делает весь код доступным кому угодно - используйте только в учебных или изолированных средах.

Ошибки и проблемы:

  • Модуль mod_rewrite может не учитывать RemoveHandler - потребуется комментарий в основном конфиге.
  • Для nginx нужно менять блок location: try_files и fastcgi_pass.
  • Сервер может кэшировать предыдущие настройки - перезагрузите службу.

Цель: быстрый просмотр всех файлов в директории без написания дополнительного кода (только для отладки).

Как просмотреть код в процессе отладки с пошаговым выполнением?

Для этого используется Xdebug - расширение PHP, которое позволяет устанавливать точки остановки, просматривать стек вызовов и значения переменных. Просмотр исходного кода в данном контексте - это не статическое отображение, а динамическое взаимодействие с кодом через IDE (например, PhpStorm, VS Code).

Пример настройки (php.ini):

zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes

После активации можно использовать var_dump с улучшенным форматированием от Xdebug, который выводит тип и длину. Например:

<?php
$user = ['name' => 'Иван', 'age' => 30];
var_dump($user);
?>

Результат с Xdebug будет содержать цвета и информации о каждом элементе.

Типичные сложности:

  • Xdebug не установлен или отключён - проверьте phpinfo().
  • IDE не подключается - настройте IDE key и порт (по умолчанию 9003).
  • Большой объём вывода может замедлить работу - отключайте при продакшне.

Цель: интерактивная отладка - увидеть, какой код выполняется в данный момент, и отследить изменение переменных.

Как увидеть, откуда была вызвана функция и какой код выполнен?

Функция debug_backtrace() возвращает массив со стеком вызовов. Это позволяет воссоздать последовательность вызовов функций и увидеть, какие файлы и строки задействованы.

<?php
function test() {
    $trace = debug_backtrace();
    foreach ($trace as $call) {
        echo $call['file'] . ':' . $call['line'] . ' - ' . $call['function'] . '\n';
    }
}
test();
?>

Результат покажет путь к файлу и строку вызова.

Проблемы:

  • Стек может быть очень глубоким - ограничьте вывод (например, array_slice).
  • В продакшене может раскрыть внутреннюю структуру - отключайте для живой среды.

Цель: понять поток выполнения при сложной архитектуре, отладка рекурсий или инъекций.

Как быстро посмотреть содержимое переменных и массивов?

Простейший способ - var_dump() и print_r(). Они не показывают сам код, но дают полную информацию о данных, с которыми работает приложение. Это незаменимо при отладке алгоритмов.

<?php
$data = ['name' => 'Тест', 'items' => [1, 2, 3]];
print_r($data);
var_dump($data);
?>

print_r выводит в более читаемом виде, var_dump добавляет типы и длины.

Ошибки:

  • Если данные содержат HTML-теги, браузер может их интерпретировать - используйте <pre> или htmlspecialchars.
  • var_dump не возвращает строку - используйте буферизацию, если нужна переменная.

Пример с буферизацией:

<?php
ob_start();
var_dump($data);
$dump = ob_get_clean();
echo htmlspecialchars($dump);
?>

Цель: мониторинг состояния данных, проверка корректности ввода и вывода.

Расширенные примеры и нестандартные ситуации

1. Сохранение результата highlight_file в строку

По умолчанию highlight_file() выводит результат напрямую. Чтобы сохранить подсвеченный код в переменную, используйте буферизацию:

Пример
<?php
ob_start();
highlight_file('example.php');
$highlighted = ob_get_clean();
// Теперь $highlighted содержит HTML с подсветкой
?>

Результат можно обработать, заменить цветовую схему или записать в лог.

2. Использование пользовательских цветов для highlight_file

Можно изменить цветовую схему через ini_set():

Пример
<?php
ini_set('highlight.string', '#ff6600');
ini_set('highlight.comment', '#999999');
ini_set('highlight.keyword', '#0000ff');
ini_set('highlight.default', '#000000');
ini_set('highlight.html', '#808080');

highlight_file('script.php');
?>

Такой подход полезен, когда нужно адаптировать вывод под корпоративный стиль или улучшить контрастность.

3. Отображение только части файла

Если нужно показать только определённые строки, прочитайте файл построчно и примените highlight_string к каждой строке. Но highlight_string работает только с полным кодом. Альтернатива - использовать file() и обрезать массив:

Пример
<?php
$lines = file('large.php');
$partial = array_slice($lines, 10, 20); // строки 11-30
$code = implode('', $partial);
echo highlight_string('<?php ' . $code . ' ?>', true);
?>

Обратите внимание: добавлен открывающий и закрывающий теги, чтобы подсветка работала корректно.

HTML-код с подсветкой заданных строк

4. Настройка nginx для отдачи .php как текста

Пример конфигурации (не рекомендуется для продакшена):

Пример
location ~ \.php$ {
    types { text/plain php; }
    # Отключаем передачу на FastCGI
    try_files $uri =404;
}

После перезагрузки nginx все .php файлы в области действия блока будут отдаваться с MIME-типом text/plain, и браузер покажет их содержимое.

5. Глубокий дамп с debug_backtrace и форматированием

Для сложного анализа можно вывести стек вызовов с аргументами:

Пример
<?php
function inner($x) {
    $bt = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS, 2);
    echo '<pre>';
    print_r($bt);
    echo '</pre>';
}
function outer($y) {
    inner($y + 1);
}
outer(5);
?>

Результат покажет только два верхних вызова (параметр depth).

Array
(
    [0] => Array
        (
            [file] => /path/to/file.php
            [line] => 12
            [function] => inner
            [args] => Array
                (
                    [0] => 6
                )
        )
    [1] => Array
        (
            [file] => /path/to/file.php
            [line] => 15
            [function] => outer
            [args] => Array
                (
                    [0] => 5
                )
        )
)

6. Использование highlight_string для кода из базы данных

Если PHP-код хранится в строке (например, в БД), используйте highlight_string():

Пример
<?php
$code = 'echo "Hello, World!";';
echo highlight_string('<?php ' . $code . ' ?>', true);
?>

Второй параметр true заставляет функцию вернуть строку, а не выводить её.

<code><span style="color: #0000bb"><?php </span><span style="color: #007700">echo </span><span style="color: #dd0000">"Hello, World!"</span><span style="color: #007700">;</span><span style="color: #0000bb"> ?></span></code>

7. Вывод Xdebug var_dump с трассировкой

При активном Xdebug var_dump показывает не только значение, но и информацию о типе, длине и расположении:

Пример
<?php
class MyClass {
    public $prop = 'test';
}
$obj = new MyClass();
var_dump($obj);
?>
class MyClass#1 (1) {
  public $prop =>
  string(4) "test"
}

Цвета и структура зависят от настроек xdebug.var_display_max_children и др.

8. Комбинирование нескольких методов для полного анализа

В реальной отладке часто совмещают: сохраняют код через highlight_file, выводят стек через debug_backtrace и дамп переменных через var_dump. Пример:

Пример
<?php
function debug_location($file, $line) {
    echo 'Текущий файл: ' . $file . ' строка ' . $line . '<br>';
    // Показываем код вокруг строки
    $lines = file($file);
    $start = max(0, $line - 5);
    $end = min(count($lines), $line + 5);
    for ($i = $start; $i < $end; $i++) {
        echo ($i+1) . ': ' . htmlspecialchars($lines[$i]) . '<br>';
    }
}

// Вызов в нужном месте
debug_location(__FILE__, __LINE__);
?>

Результат - фрагмент кода с контекстом, что очень удобно при разборе неожиданных ошибок.

Просмотр исходного кода PHP - comments

En
Php view source (php)