私は現在resource
、ルックアップのために s をハッシュする次の方法を使用しています。
$foo = socket_create(...);
$bar = socket_create(...);
$map[(int)$foo] = 'foo';
$map[(int)$bar] = 'bar';
echo $map[(int)$foo]; // "foo"
これにはinteger
キャストが最適なオプションですか?そうでない場合、他のどのハッシュ方法がより優れた、またはより効率的でしょうか? これらのルックアップは、タイト ループ (ソケット ポーリング) で 1 秒間に何度も数百回のコレクションで実行されるため、反復ベースのソリューションは既に除外しています。
編集:
私の状況をもう少し詳しく説明すると、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...
}