Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 리소스(Resource) 타입 완벽 정리: 개념, 종류, get_resource_type() 함수 활용법

정의 및 사용법

PHP에서 리소스(Resource)는 외부 자원을 참조하는 특수한 데이터 타입입니다. 리소스 변수는 스트림(stream), 파일, 데이터베이스 등 외부 데이터 소스에 대한 참조 역할을 하며, PHP는 각 용도에 맞는 전용 함수를 통해 이러한 리소스를 생성합니다. 예를 들어 fopen() 함수는 디스크상의 파일을 열고, 그 참조가 리소스 변수에 저장됩니다.

PHP의 Zend 엔진은 참조 카운팅(reference counting) 방식을 사용합니다. 따라서 참조 횟수가 0이 된 리소스는 가비지 컬렉터(garbage collector)가 자동으로 소멸시키기 때문에, 리소스 데이터 타입이 사용하는 메모리를 수동으로 해제할 필요가 없습니다.

PHP 스크립트에서는 각 기능에 대응하는 함수들을 통해 다양한 유형의 리소스를 처리할 수 있습니다. 아래 표는 주요 리소스 유형을 정리한 것입니다.

리소스 타입 이름생성 함수해제 함수설명
bzip2bzopen()bzclose()Bzip2 압축 파일
curlcurl_init()curl_close()Curl 세션
ftpftp_connect()ftp_close()FTP 스트림
mssql linkmssql_connect()mssql_close()Microsoft SQL Server 데이터베이스 연결
mysql linkmysql_connect()mysql_close()MySQL 데이터베이스 연결
mysql resultmysql_db_query()mysql_free_result()MySQL 쿼리 결과셋
oci8 connectionoci_connect()oci_close()Oracle 데이터베이스 연결
ODBC linkodbc_connect()odbc_close()ODBC 데이터베이스 연결
pdf documentpdf_new()pdf_close()PDF 문서
streamopendir()closedir()디렉터리 핸들
streamfopen(), tmpfile()fclose()파일 핸들
socket-fclose()소켓 핸들
xmlxml_parser_create()xml_parser_free()XML 파서
zlibgzopen()gzclose()gz 압축 파일
zlib.deflatedeflate_init()없음점진적(incremental) deflate 컨텍스트
zlib.inflateinflate_init()없음점진적 inflate 컨텍스트

참고로 위 표의 mysql_* 계열 함수는 PHP 5.5부터 지원 중단(deprecated)되었으며 PHP 7부터 완전히 제거되었으므로, 최신 프로젝트에서는 MySQLi 또는 PDO 확장을 사용하는 것이 좋습니다.

PHP에는 변수의 리소스 타입을 문자열로 반환하는 get_resource_type() 함수가 내장되어 있어, 현재 다루고 있는 리소스가 어떤 종류인지 손쉽게 확인할 수 있습니다.

문법(Syntax)

get_resource_type ( resource $handle ) : string

$handle은 타입을 확인하고자 하는 리소스 변수이며, 이 함수는 해당 리소스 타입에 대응하는 문자열을 반환합니다.

다음 예제는 디스크 파일의 리소스 정보를 출력합니다.

예제 1

<?php
$fp = fopen("test.txt", "w");
var_dump($fp);
?>

실행 결과

resource(5) of type (stream)

위 결과에서 볼 수 있듯이 fopen()으로 생성된 리소스는 ID 5번을 가지며, 타입은 'stream'임을 확인할 수 있습니다.

다음 예제는 get_resource_type() 함수를 직접 사용하는 방법을 보여줍니다.

예제 2

<?php
$fp = fopen("test.txt", "w");
echo get_resource_type($fp) . " ";
?>

실행 결과

stream

이처럼 get_resource_type() 함수를 활용하면 코드 실행 중에 리소스 변수의 실제 타입을 동적으로 확인할 수 있어, 디버깅이나 조건 분기 로직 작성 시 유용하게 사용됩니다.