我有多个资源。.一些是套接字,其他是fopen处理程序..
$handle = fopen('file', 'w');
print_r($handle);
将输出
Resource id #20
您可以通过执行intval($handle);
是否可以逆转它。如果您有ID,是否可以获取资源?
答案 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