に私は現在、検索にresource
Sをハッシュの次のメソッドを使用しています:はPHP
$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...
}
実際には、連想配列を 'socket_select()'に渡すことは考えていませんでした。それはうまくいくかもしれません。私は後でこれをテストしなければならないでしょう。フォローアップしてお知らせします。ありがとう! – FtDRbwLXw6
私はちょうどこれをテストし、キーは 'socket_select()'コールによって保持され、すべてがうまくいきます。あなたの努力と助けに本当に感謝しているので、私はあなたの答えを受け入れて、賞金を授与しました(私がそれを授与する前に24時間)。ありがとうございました! – FtDRbwLXw6
@drrcknlsn yay!それはうまくいきます。そして賞金を感謝します! – Gordon