PHP资源ID是唯一的吗?

4

PHP资源ID在每个PHP实例中是唯一的吗?将所有类型的资源强制转换为字符串是否返回"Resource id #X"(其中X是某个十进制数)?是否有一个函数返回资源ID(我知道get_resource_type()可以获取资源类型,但没有找到类似get_resouce_id()的东西),或者必须像这样完成?

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

1
关于“Resource id #1”的结构 - PHP手册指出:“不要依赖这个结构,它可能会发生变化。”因此,您获取ID的方法并不推荐。 - MrWhite
@w3d 很抱歉,我不知道有任何更好的(其他)方法来获取ID。你知道吗? - Jakub Kulhan
不好意思,其实不需要!除了验证确实返回数字字符串之外,如果没有,则尝试另一种方法获取ID,例如在“#”上使用explode()并获取第二个元素(如果存在)等。返回的字符串仅取决于(版本的)PHP吗?或者资源本身是否可能影响强制转换期间发生的情况?说实话,如果只是PHP,那么我认为你现在应该相当安全...!如果您只是想要唯一的ID,那么可以使用整个字符串,或者进行哈希处理,也许? - MrWhite
2个回答

6

就像表面看起来的那样容易

intval($resource)

4
Jakub,是的,PHP将为当前正在使用的每个资源提供唯一的ID。当资源被unset()或free'd时,例如mysql_free_result。然后该ID再次可用,PHP可以再次重用这些资源。
如果您正在“缓存”或在会话中保存资源ID并重复使用它们,请注意,因为PHP可能会释放资源,然后重新创建具有该ID的新资源,而您的旧资源ID可能指向新内容。
所以,这就是资源的独特性,但不是永久的!
希望这有助于为您解密PHP中的资源类型。

在某些环境下,当不同的用户连接到相同的(共享)资源时,是否有可能它们会获得相同的资源ID?或者说这是不可能的吗? - MrWhite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接