我目前使用以下哈希方法来查找资源
:
$foo = socket_create(...);
$bar = socket_create(...);
$map[(int)$foo] = 'foo';
$map[(int)$bar] = 'bar';
echo $map[(int)$foo]; // "foo"
这种情况下,整数强制转换是否是最佳选择?如果不是,有哪些更好或更有效的哈希方法?这些查找将在一个集合中执行,每秒多次在紧密的循环(套接字轮询)中进行,因此我已经排除了迭代式的解决方案。
编辑: 为了更好地解释我的情况,socket_select() 函数通过引用获取套接字资源数组,并修改它们,以便在函数调用后,它们仅包含已更改的资源(例如准备从中读取)。我使用 Socket 类作为套接字资源的包装器,使我的代码更抽象化和可测试。
$socketObject = new Socket($socketResource);
我的另一个类会保留所有需要在调用 socket_select()
时轮询的套接字资源列表:
$reads = [$socketResource1, $socketResource2, ...];
socket_select($reads, null, null, 0);
在调用
socket_select()
后,我知道哪些套接字 资源 发生了变化,但是为了在我的代码中执行任何有意义的操作,我需要知道这些资源对应的套接字 对象。因此,我需要一种将套接字资源映射到它们的对象的方法:foreach ($reads as $socketResource) {
// Which socket object does $socketResource correspond to here?
// Currently, I use a solution like this:
$socketObject = $this->map[(int)$socketResource];
// Unfortunately, this behavior isn't guaranteed, so it isn't reliable...
}
socket_select()
函数;这可能会起作用。我稍后会测试一下。我会跟进并让你知道结果。谢谢! - FtDRbwLXw6socket_select()
调用得以保留,一切都很顺利。我已经接受了你的答案并开始了悬赏(在24小时后才能颁发),因为我非常感谢你的努力和帮助。谢谢! - FtDRbwLXw6