Tôi hiện đang sử dụng phương pháp sau đây băm resource
s để tra cứu:Sử dụng tài nguyên như chỉ số mảng trong PHP
$foo = socket_create(...);
$bar = socket_create(...);
$map[(int)$foo] = 'foo';
$map[(int)$bar] = 'bar';
echo $map[(int)$foo]; // "foo"
là integer
đúc lựa chọn tốt nhất cho việc này? Nếu không, phương pháp băm nào khác sẽ tốt hơn hoặc hiệu quả hơn? Những tra cứu sẽ được thực hiện trong một bộ sưu tập vào hàng trăm, nhiều lần mỗi giây trong một vòng lặp chặt chẽ (socket polling), vì vậy tôi đã loại trừ các giải pháp dựa trên lặp lại.
Edit:
Để giải thích hoàn cảnh của tôi tốt hơn một chút, các socket_select()
hàm lấy mảng tài nguyên ổ cắm bằng cách tham khảo và sửa đổi chúng như rằng sau khi gọi hàm, họ sẽ chỉ chứa các nguồn lực đó đã thay đổi (ví dụ sẵn sàng để được đọc từ). Tôi sử dụng một lớp Socket
như là một wrapper cho nguồn tài nguyên ổ cắm, để làm cho mã của tôi trừu tượng hơn và kiểm chứng:
$socketObject = new Socket($socketResource);
Một lớp học của tôi giữ một danh sách của tất cả các nguồn tài nguyên ổ cắm cần được thăm dò ý kiến mỗi khi chúng ta gọi là socket_select()
:
$reads = [$socketResource1, $socketResource2, ...];
socket_select($reads, null, null, 0);
Sau khi cuộc gọi đến socket_select()
, tôi biết đó là ổ cắm nguồn đã thay đổi, nhưng để làm bất cứ điều gì có ý nghĩa trong mã của tôi, tôi cần phải biết ổ cắm đối tượng những nguồn lực tương ứng với . Vì vậy, tôi cần một số cách để lập bản đồ tài nguyên ổ cắm vào các đối tượng của họ:
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...
}
Tôi thực sự không bao giờ nghĩ đến việc truyền mảng kết hợp tới 'socket_select()'; nó có thể hoạt động. Tôi sẽ phải kiểm tra điều này sau. Tôi sẽ theo dõi và cho bạn biết. Cảm ơn! – FtDRbwLXw6
Tôi vừa thử nghiệm điều này, và các phím được bảo tồn thông qua cuộc gọi 'socket_select()', và mọi thứ đều hoạt động tốt. Tôi đã chấp nhận câu trả lời của bạn và bắt đầu một tiền thưởng (24 giờ trước khi tôi có thể trao giải) bởi vì tôi thực sự đánh giá cao nỗ lực và sự giúp đỡ của bạn. Cảm ơn bạn! – FtDRbwLXw6
@drrcknlsn yay! Happy nó hoạt động. Và đánh giá cao tiền thưởng! – Gordon