정의 및 사용법
PHP에서 리소스(Resource)는 외부 자원을 참조하는 특수한 데이터 타입입니다. 리소스 변수는 스트림(stream), 파일, 데이터베이스 등 외부 데이터 소스에 대한 참조 역할을 하며, PHP는 각 용도에 맞는 전용 함수를 통해 이러한 리소스를 생성합니다. 예를 들어 fopen() 함수는 디스크상의 파일을 열고, 그 참조가 리소스 변수에 저장됩니다.
PHP의 Zend 엔진은 참조 카운팅(reference counting) 방식을 사용합니다. 따라서 참조 횟수가 0이 된 리소스는 가비지 컬렉터(garbage collector)가 자동으로 소멸시키기 때문에, 리소스 데이터 타입이 사용하는 메모리를 수동으로 해제할 필요가 없습니다.
PHP 스크립트에서는 각 기능에 대응하는 함수들을 통해 다양한 유형의 리소스를 처리할 수 있습니다. 아래 표는 주요 리소스 유형을 정리한 것입니다.
| 리소스 타입 이름 | 생성 함수 | 해제 함수 | 설명 |
| bzip2 | bzopen() | bzclose() | Bzip2 압축 파일 |
| curl | curl_init() | curl_close() | Curl 세션 |
| ftp | ftp_connect() | ftp_close() | FTP 스트림 |
| mssql link | mssql_connect() | mssql_close() | Microsoft SQL Server 데이터베이스 연결 |
| mysql link | mysql_connect() | mysql_close() | MySQL 데이터베이스 연결 |
| mysql result | mysql_db_query() | mysql_free_result() | MySQL 쿼리 결과셋 |
| oci8 connection | oci_connect() | oci_close() | Oracle 데이터베이스 연결 |
| ODBC link | odbc_connect() | odbc_close() | ODBC 데이터베이스 연결 |
| pdf document | pdf_new() | pdf_close() | PDF 문서 |
| stream | opendir() | closedir() | 디렉터리 핸들 |
| stream | fopen(), tmpfile() | fclose() | 파일 핸들 |
| socket | - | fclose() | 소켓 핸들 |
| xml | xml_parser_create() | xml_parser_free() | XML 파서 |
| zlib | gzopen() | gzclose() | gz 압축 파일 |
| zlib.deflate | deflate_init() | 없음 | 점진적(incremental) deflate 컨텍스트 |
| zlib.inflate | inflate_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() 함수를 활용하면 코드 실행 중에 리소스 변수의 실제 타입을 동적으로 확인할 수 있어, 디버깅이나 조건 분기 로직 작성 시 유용하게 사용됩니다.