【发布时间】:2013-07-20 12:25:25
【问题描述】:
我目前正在使用以下散列方法对resources 进行查找:
$foo = socket_create(...);
$bar = socket_create(...);
$map[(int)$foo] = 'foo';
$map[(int)$bar] = 'bar';
echo $map[(int)$foo]; // "foo"
integer 是否是最好的选择?如果不是,还有什么其他散列方法会更好或更有效?这些查找将在一个紧密循环(套接字轮询)中以每秒数百次的方式在一个集合中执行,因此我已经排除了基于迭代的解决方案。
编辑:
为了更好地解释我的情况,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...
}
【问题讨论】: