Просмотр ресурсов 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
...Функция показывает не только тип ресурса, но и его внутреннее состояние (для потоков - флаги тайм-аута, блокировки, конца файла). Это незаменимо при поиске проблем с чтением/записью.
Как быстро проверить наличие ресурса без деталей?
Функция is_resource() возвращает true, если переменная является ресурсом, и false в противном случае. Используется для простой проверки перед работой.
$res = fopen('/tmp/test.txt', 'r');
if (is_resource($res)) {
echo 'Ресурс открыт';
} else {
echo 'Ресурс недоступен';
}Ресурс открыт
Как узнать конкретный тип ресурса (файл, сокет, база данных)?
Функция 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
Как получить расширенную отладочную информацию о ссылках на ресурс?
Функция debug_zval_refs() показывает количество ссылок на ресурс и его внутреннее содержимое. Применяется для обнаружения утечек памяти или неожиданного совместного использования.
$file = fopen('/tmp/test.txt', 'a');
$ref = $file;
debug_zval_refs($file);resource(5) refcount(2) of type (stream)
stream <?php
...Этот метод полезен при оптимизации скриптов, работающих с большим количеством файловых дескрипторов.
Каждый из вариантов решает свою задачу: 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().