Obecnie używam następujący sposób mieszania resource
s do poszukiwania:Korzystanie z zasobów jako indeksów tablicy w PHP
$foo = socket_create(...);
$bar = socket_create(...);
$map[(int)$foo] = 'foo';
$map[(int)$bar] = 'bar';
echo $map[(int)$foo]; // "foo"
Czy integer
odlewania najlepsze rozwiązanie dla tego? Jeśli nie, to jaka inna metoda haszowania byłaby lepsza lub bardziej wydajna? Te wyszukiwania będą wykonywane w zbiorze do setek, wiele razy na sekundę w ciasnej pętli (odpytywanie gniazd), więc wykluczyłem już rozwiązania oparte na iteracji.
Edit:
Aby wyjaśnić moją sytuację trochę lepiej, funkcja socket_select()
bierze tablic zasobów gniazd przez odniesienie i modyfikuje je tak, że po wywołaniu funkcji, będą one zawierać tylko te środki, które zostały zmienione (np. gotowy do odczytania). Używam klasy Socket
jako wrapper dla zasobów gniazd, aby mój kod bardziej abstrakcyjne i sprawdzalne:
$socketObject = new Socket($socketResource);
Innym z moich klas przechowuje listę wszystkich zasobów gniazdowych, które muszą być odpytywany za każdym razem nazywamy socket_select()
:
$reads = [$socketResource1, $socketResource2, ...];
socket_select($reads, null, null, 0);
Po wywołaniu socket_select()
, wiem, które gniazdo zasoby uległy zmianie, ale do niczego sensownego w moim kodu, muszę wiedzieć, jakie gniazdo obiektów środki te odpowiadają . Zatem muszę jakiś sposób mapowania zasobów gniazd do ich obiektów:
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...
}
Właściwie nigdy nie myślałem o przekazaniu tablicy asocjacyjnej do 'socket_select()'; może po prostu działać. Będę musiał to przetestować później. Pójdę za tobą i dam ci znać. Dzięki! – FtDRbwLXw6
Właśnie przetestowałem to, a klucze są zachowywane przez wywołanie 'socket_select()', a wszystko działa świetnie. Przyjąłem twoją odpowiedź i rozpocząłem nagrodę (24 godziny przed przyznaniem nagrody), ponieważ naprawdę doceniam twój wysiłek i pomoc. Dziękuję Ci! – FtDRbwLXw6
@drrcknlsn yay! Cieszę się, że działa. I doceń nagrodę! – Gordon