Просмотр ресурсов PHP отладка и анализ

Раздел: Обучение -> Управление ресурсами

Обзор функций для просмотра ресурсов PHP

Как наиболее полно и информативно просмотреть любой ресурс PHP?

Основным и самым информативным способом является использование функции var_dump(). Она выводит структурированную информацию о переменной, включая тип ресурса, его идентификатор (например, resource(5) of type (stream)), а также иногда дополнительные метаданные. Это универсальное решение для отладки.

$file = fopen('/tmp/test.txt', 'w');
var_dump($file);
resource(5) of type (stream)
  stream <?php
    timed_out    => false
    blocked      => true
    eof          => false
    ...

Функция показывает не только тип ресурса, но и его внутреннее состояние (для потоков - флаги тайм-аута, блокировки, конца файла). Это незаменимо при поиске проблем с чтением/записью.

Типичная ошибка: вызов var_dump() для уже закрытого ресурса приведёт к выводу resource(5) of type (Unknown) или false. Перед просмотром следует проверять, что ресурс ещё существует (с помощью is_resource()).

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

Функция is_resource() возвращает true, если переменная является ресурсом, и false в противном случае. Используется для простой проверки перед работой.

$res = fopen('/tmp/test.txt', 'r');
if (is_resource($res)) {
    echo 'Ресурс открыт';
} else {
    echo 'Ресурс недоступен';
}
Ресурс открыт
Важно: is_resource() не отличает закрытый ресурс - он тоже может возвращать true в некоторых версиях PHP. Надёжнее комбинировать с проверкой типа через get_resource_type().

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

Функция get_resource_type() возвращает строку с названием типа (например, stream, curl, gd). Полезна при работе с разными типами ресурсов.

$stream = fopen('php://stdin', 'r');
echo get_resource_type($stream);
stream
Как вывести информацию о ресурсе более компактно, чем var_dump?

Функция print_r() возвращает удобочитаемое представление, но для ресурсов показывает только идентификатор и тип (например, Resource id #5). Подходит для быстрого взгляда без глубоких деталей.

$res = fopen('/tmp/test.txt', 'r');
print_r($res);
Resource id #5
print_r() не показывает метаданные потока. Если нужны флаги (eof, blocked) - используйте var_dump() или stream_get_meta_data().
Как получить расширенную отладочную информацию о ссылках на ресурс?

Функция debug_zval_refs() показывает количество ссылок на ресурс и его внутреннее содержимое. Применяется для обнаружения утечек памяти или неожиданного совместного использования.

$file = fopen('/tmp/test.txt', 'a');
$ref = $file;
debug_zval_refs($file);
resource(5) refcount(2) of type (stream)
  stream <?php
    ...

Этот метод полезен при оптимизации скриптов, работающих с большим количеством файловых дескрипторов.

Функция debug_zval_refs() нестабильна в продакшене и рекомендуется только для разработки. Не применяйте её на рабочих серверах без острой необходимости.

Каждый из вариантов решает свою задачу: var_dump - для полной отладки; is_resource - для быстрой проверки; get_resource_type - для определения вида ресурса; print_r - для минималистичного вывода; debug_zval_refs - для анализа ссылок. Выбор зависит от контекста: отладка, аудит, логирование.

Расширенные примеры просмотра ресурсов

1. Просмотр потокового ресурса с метаданными

Пример
// Открываем удалённый ресурс
$context = stream_context_create(['http' => ['method' => 'GET']]);
$stream = fopen('https://www.php.net', 'r', false, $context);

// Полный просмотр
var_dump($stream);

// Метаданные потока
$meta = stream_get_meta_data($stream);
print_r($meta);

fclose($stream);
resource(5) of type (stream)
  stream <?php
    timed_out        => false
    blocked          => true
    eof              => false
    wrapper_data     => array(...)
    wrapper_type     => 'http'
    stream_type      => 'tcp_socket/ssl'
    ...

Array
(
    [timed_out] => 
    [blocked] => 1
    [eof] => 
    [wrapper_data] => Array (...)
    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    ...
)

Этот пример показывает, как с помощью var_dump() и stream_get_meta_data() получить полную информацию о потоке HTTP, включая заголовки ответа.

2. Определение типа ресурса для работы с изображениями

Пример
// Создание GD-ресурса
$im = imagecreatetruecolor(100, 100);

// Просмотр типа
$type = get_resource_type($im);
echo 'Тип ресурса: ' . $type . PHP_EOL;

// Проверка существования
if (is_resource($im)) {
    echo 'Ресурс изображения активен' . PHP_EOL;
}

imagedestroy($im);
Тип ресурса: gd
Ресурс изображения активен

Функция get_resource_type() возвращает gd для GD-изображений. Это позволяет отличать их от файловых потоков.

3. Обнаружение дублирования ресурсов через debug_zval_refs

Пример
$db = mysqli_connect('localhost', 'user', 'pass', 'test');
$db2 = $db;

debug_zval_refs($db);

mysqli_close($db);
// После закрытия
var_dump($db);        // resource(3) of type (Unknown)
var_dump($db2);       // resource(3) of type (Unknown) - оба ссылаются на один дескриптор
resource(3) refcount(2) of type (mysql link)
  ...

Здесь видно, что одна и та же ссылка на соединение MySQL имеет счётчик ссылок 2. Закрытие через одну переменную делает недоступным и другой ресурс - это распространённая ошибка.

4. Комбинирование is_resource с get_resource_type для расширенной проверки

Пример
function checkResource($res) {
    if (is_resource($res) && get_resource_type($res) === 'stream') {
        echo 'Это потоковый ресурс';
    } elseif (is_resource($res)) {
        echo 'Ресурс другого типа: ' . get_resource_type($res);
    } else {
        echo 'Не является ресурсом';
    }
}

$f = fopen('/tmp/test.txt', 'r');
checkResource($f);
fclose($f);
checkResource($f);
Это потоковый ресурс
Не является ресурсом

Такой подход позволяет безопасно обрабатывать ресурсы, зная их тип и состояние.

5. Просмотр ресурса соединения с CURL

Пример
$ch = curl_init('https://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$info = var_export($ch, true); // var_export не работает с ресурсами
var_dump($ch);
echo 'Тип ресурса: ' . get_resource_type($ch);
curl_close($ch);
resource(6) of type (curl)
Тип ресурса: curl

Для CURL-дескрипторов var_dump() показывает только идентификатор и тип (curl). Для получения параметров используйте curl_getinfo().

Просмотр ресурсов PHP - comments

En
Resources php view (php)