通过唯一ID获取活动资源

时间:2018-08-30 22:49:42

标签: php

我有多个资源。.一些是套接字,其他是fopen处理程序..

$handle = fopen('file', 'w');
print_r($handle);

将输出

Resource id #20

您可以通过执行intval($handle);

来获取资源ID。

是否可以逆转它。如果您有ID,是否可以获取资源?

1 个答案:

答案 0 :(得分:0)

在PHP7上,您可以使用以下代码获取具有ID的资源:

function fetchResourcePHP7($id){
    if(!is_int($id)) return false;
    foreach(get_resources() as $v){
        if(intval($v)==$id) return $v;
    }
    return false;
}

在PHP5上,您可以使用此自定义递归函数来实现同一目的

function fetchResource5($id,$array=array(),$restart=true){
    static $result=false;
    if($restart) $result=false;
    if(is_resource($result)) return $result;
    if(!is_array($array)) return false;
    if(!is_int($id)) return false;
    $avoid=['_GET'=>0,'_POST'=>0,'_FILES'=>0,'_REQUEST'=>0,'GLOBALS'=>0,'_COOKIE'=>0];
    if(!$array){
        foreach($GLOBALS as $k=>$v){
            if(is_resource($v)&&intval($v)==$id){
                $result=$v; 
            }
            elseif(is_array($v)&&!isset($avoid[$k])){
                fetchResource($id,$v,false);
            }
        }
    }
    else{
        foreach($array as $k=>$v){
            if(is_resource($v)&&intval($v)==$id){
                $result=$v; 
            }
            elseif(is_array($v)&&!isset($avoid[$k])){
                fetchResource($id,$v,false);
            }
        }
    }
    return $result;

}

它查看GLOBALS变量或给定的$ array以检索期望的资源(如果存在)。

函数的用法很简单:

function any($var){
    $onevar='';
    $anothervar='';
     //an useless example of fetch row here,you could provide $GLOBALS array instead of local variables 
    $someresource=fopen('sometext.txt','r');
    $getresource=fecthResource5(5,get_defined_vars());//always ignore the third argument ,the id 5 is just an example
    return true;
}

在全局范围内,用法更加简单:

 var_dump(fetchResource5(36));//if a resource with id 36 exists it will dump it