>백엔드 개발 >PHP 튜토리얼 >PHP: 리소스 데이터 유형 예제에 대한 자세한 설명

PHP: 리소스 데이터 유형 예제에 대한 자세한 설명

怪我咯
怪我咯원래의
2018-05-16 16:08:0718332검색

리소스 데이터 유형이란 무엇입니까?

리소스 데이터 유형은 PHP4에서 도입되었습니다. 리소스는 열린 파일, 데이터베이스 연결, 그래픽 캔버스 영역 등과 같은 외부 리소스에 대한 참조를 보유하는 특수 변수 유형입니다.

리소스는 특화된 기능을 통해 생성되고 사용됩니다.

PHP에서 리소스 변수 사용

$fp = fopen("test.txt", "rw");  
  
var_dump($fp);  
  
fclose($fp);

인쇄 결과: (스트림) 유형의 리소스(5)

숫자 5: 리소스 ID가 5임을 나타냅니다. 의미는 소개를 따를 것입니다.

스트림: 리소스 유형 이름.

리소스 ID

커널은 등록된 리소스 변수를 HashTable에 저장하고, 리소스가 위치한 HashTable의 키를 리소스 ID로 사용한다.

그래서 실제로 PHP의 리소스 변수는 정수로 저장되며, 이 ID를 통해 HashTable의 해당 리소스를 찾습니다.

#define Z_RESVAL(zval)          (zval).value.lval  
#define Z_RESVAL_P(zval)        Z_RESVAL(*zval)  
#define Z_RESVAL_PP(zval)       Z_RESVAL(**zval)

위 매크로는 ZE가 커널에서 리소스 변수에 값을 할당하는 데 사용하는 API인데 실제로는 정수 변수에 대한 할당임을 알 수 있습니다.

리소스 유형 이름

리소스 유형을 구별하려면 정의하는 리소스에 대한 유형 이름을 정의해야 합니다.

#define MY_RES_NAME "my_resource" //资源类型名称,PHP通过var_dump打印资源变量时会看到这个名称  
static int my_resource_descriptor;  
  
ZEND_MINIT_FUNCTION(jinyong)  
{  
    my_resource_descriptor = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);//向内核中注册新的资源类型  
}

ZEND_MINIT_FUNCTION(jinyong)은 PHP가 SAPI로 메모리에 로드될 때 모든 확장의 ZEND_MINIT_FUNCTION을 실행합니다(예: Apache의 mod_php5 확장).

여기서 jinyong은 현재 확장 프로그램의 이름입니다. 예를 들어 이때 확장 이름은 jinyong

이해의 편의를 위해 초기화 시 커널에 새로운 리소스 유형을 등록하는 확장이라고 생각하면 됩니다.

리소스 변수 생성

리소스 유형이 성공적으로 등록되었으며 리소스에 대해 구별되는 유형 이름이 정의되었습니다. 이제 이 자원에 대한 변수를 사용할 수 있습니다.

PHP에서 fopen 함수 구현:

PHP_FUNCTION(my_fopen)  
{  
    zval *res;  
  
    char *filename, *mode;  
      
    int filename_strlen, mode_strlen;  
  
    FILE *fp;  
      
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "s|s",  &filename, &filename_strlen, &mode, &mode_strlen) == FAILURE){  
        RETURN_FALSE;  
    }  
  
    //此处省略了对参数的有效性验证  
    fp = fopen(filename, mode);  
  
    ZEND_REGISTER_RESOURCE(res, fp, my_resource_descriptor);//向全局变量&EG(regular_list)中注册资源变量,并将对应HashTable的ID赋值给res  
  
    RETURN_RESOURCE(res);//向PHP返回资源变量  
}

여기서 PHP에서 my_fopen이라는 함수가 정의됩니다. my_fopen(string $file_name, string $mode)

는 PHP에서 fclose 함수를 구현합니다.

PHP_FUNCTION(my_fclose)  
{  
    zval *res;  
      
    FILE *fp;  
  
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMS_CC, "r", &res) == FAILURE){  
        RETURN_FALSE;  
    }  
  
    if(Z_TYPE_P(res) == IS_RESOURCE){//判断变量类型是否是资源类型  
        zend_hash_index_del(&EG(regular_list), Z_RESVAL_P(res));//EG就类似于PHP中的$_GLOBALS。在全局资源变量regular_list中删除对应ID的资源  
    }else{  
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数必须是资源类型变量");  
        RETURN_FALSE;  
    }  
  
    RETURN_TRUE;  
}

는 PHP에서 my_fclose라는 함수를 정의합니다. my_fclose($resource)

PHP

my_fwrite($fp, "aaTest");  
  
var_dump($fp);  
  
my_fclose($fp);  
  
var_dump($fp);

의 사용자 정의 확장에 있는 메소드를 사용하면 리소스를 정상적으로 열고 닫을 수 있습니다.

리소스 해제

PHP4 Zend 엔진은 리소스 계산 시스템을 도입하므로 리소스가 더 이상 참조되지 않음(Java와 마찬가지로)을 자동으로 감지할 수 있습니다. 이 경우 이 리소스에서 사용하는 모든 외부 리소스는 가비지 수집 시스템에 의해 해제됩니다. 따라서 일부 free-result 함수를 사용하여 수동으로 메모리를 해제할 필요는 거의 없습니다.

참고: 영구 데이터베이스 연결은 특별하며 가비지 수집 시스템에 의해 파괴되지 않습니다.

다음 섹션에서는 두 가지 특수 데이터 유형 중 "널 값(null)"에 대해 설명하겠습니다.

위 내용은 PHP: 리소스 데이터 유형 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.