2010-07-29 5 views
4

PHP 인스턴스 당 PHP 리소스 ID가 고유합니까? 모든 종류의 리소스를 문자열로 형 변환하면 "Resource id #X"가 반환됩니다 (X은 10 진수입니다). 리소스 ID를 반환하는 함수가 있습니까 (예 : get_resource_type()에 대한 리소스 유형을 얻으려고했지만 get_resouce_id()과 같은 항목을 찾지 못했습니까?) 또는이 작업을 수행해야합니까?PHP 리소스 ID는 고유합니까?

function get_resource_id($resource) 
{ 
    return is_resource($resouce) 
      ? substr((string) $resource, 13 /* strlen("Resource id #") */) 
      : NULL; 
} 
+1

시임으로 ● - [PHP 설명서 (http://www.php.net/manual/en/language.types.string .php # language.types.string.casting)은 "이 구조체에 의지하지 마십시오. 변경 될 수 있습니다."라고 말하므로 ID를 얻는 방법은 권장되지 않습니다. – MrWhite

+0

@ w3d 불행히도, 나는 ID를 얻기 위해 더 나은 (다른) 방법을 모른다. 너? –

+0

죄송합니다. 실제로 숫자 문자열이 반환되는지 확인하는 것 외에 다른 방법으로 ID를 얻으십시오. explode()를 '#'에두고 두 번째 요소를 얻습니다. (존재하는 경우) 반환 된 문자열은 PHP의 버전에 전적으로 의존합니까? 또는 리소스 자체가 캐스팅 도중 일어나는 일에 영향을 미칠 수 있습니까? TBH, 만약 PHP가 그렇다면 아마 당신은 꽤 안전 할 것입니다. 나는 지금 생각했습니다 ...! 고유 한 ID 바로 뒤에 있다면 전체 문자열을 사용할 수도 있고 _hash_ 일 수도 있습니다. – MrWhite

답변

4

Jakub, yes PHP는 항상 현재 사용중인 모든 리소스에 대해 고유 한 ID를 제공합니다. 자원이 unset()이거나 mysql_free_result과 같은 free 인 경우. 그런 다음 해당 ID를 다시 사용할 수 있고 PHP는 이러한 리소스를 다시 사용할 수 있습니다.

PHP가 자원을 확보 할 수 있기 때문에 "캐싱"하거나 세션에서 자원 ID를 유지하고 재사용하는 경우 조심하십시오. 그런 다음 해당 ID로 새 자원을 다시 작성하면 이전 자원 ID가 새로운 내용을 가리킬 수 있습니다.

리소스가 있으므로 리소스가 독특하지만 영원하지는 않습니다.

희망이 있으면 PHP의 리소스 유형을 쉽게 파악할 수 있습니다.

+0

특정 환경에서 동일한 (공유) 리소스에 연결할 때 2 명의 다른 사용자가 _same_ 리소스 ID를 가져올 수 있습니까? 아니면 불가능한가요? – MrWhite

6

진정 "는 자원 ID # 1"의 구조에 대해서

intval($resource)