글쎄, 초보 수준의 질문이어야 하는데 문서를 읽어도 여전히 이해가 되지 않습니다.
글쎄, 초보 수준의 질문이어야 하는데 문서를 읽어도 여전히 이해가 되지 않습니다.
PHP의 소켓은 리소스 유형입니다.
resource(4) 유형은 (Socket)입니다. 즉, 각 소켓 핸들은 동일하게 보입니다. .
Linux C 소켓 fd는 int 정수이며 각각 다른 숫자입니다.
기본 PHP는 "사용자 uid=123인 연결된 사용자에게 메시지를 적극적으로 푸시"할 수 없습니다.
Linux C를 사용하여 구현된 Swoole의 소켓을 사용하면 "연결된 사용자에게 메시지를 적극적으로 푸시"할 수 있습니다. 자, uid=123인 사용자에게 메시지를 보내주세요."
여기서 System V의 가장 간단한 공유 메모리를 사용하여 프로세스 간에 데이터 IPC를 공유하고 사용자 ID와 소켓 연결 간의 매핑 테이블을 유지할 수 있습니다.
코드는 다음과 같습니다.
<code><?php $serv = new swoole_server("127.0.0.1", 1024); $serv->set(array( 'worker_num' => 8, //工作进程数量 'daemonize' => false, //是否作为守护进程 )); $shmid = shm_attach(getmypid(), 1024*66); # allocate 66kB for shared memory define("SHARED_UID_CONNECTION_MAP", 12); shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, []); $serv->on('connect', function ($serv, $fd) use($shmid) { echo "Client:Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) use($shmid) { $serv->send($fd, 'Swoole: '.$data); // $serv->close($fd); $trimdata = trim($data); if ($trimdata == 'i am lucky man') { $map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP); $map[] = $fd; #$map[$uidFromData] = $fd; shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, $map); } if ($trimdata == 'broadcast to lucky man') { $map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP); // var_dump($map); $ $map is array whose valuse is int $fd foreach($map as $fd) { $serv->send($fd, "some body broadcast to you luck man"); } } # broadcast to all users // $start_fd = 0; // while(true) // { // $conn_list = $serv->connection_list($start_fd, 10); // if($conn_list===false or count($conn_list) === 0) // { // echo "finish\n"; // break; // } // $start_fd = end($conn_list); // var_dump($conn_list); // foreach($conn_list as $fd) // { // $serv->send($fd, "broadcast"); // } // } // var_dump($serv->connections); // foreach ($serv->connections as $k => $v) { // $lk = [$k,$v]; // var_dump($lk); // } }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->start(); </code>
그런 다음 n 클라이언트를 열어 코드를 테스트할 수 있습니다. 예를 들어 3개의 텔넷 127.0.0.1 1024를 엽니다. 마지막 클라이언트는 "i am Lucky man"이라는 메시지를 서버에 보내고 첫 번째 클라이언트는 "broadcast"를 보냅니다. to the Lucky Man", 세 번째는 "Some Body Broadcast to You Lucky Man"을 수신하여 특정 사용자에게 메시지를 보냅니다
그렇게 간단합니다.
Swoole은 훌륭한 방법이고, 비동기 IO 다중 프로세스도 가장 성숙한 엔딩 솔루션입니다(Nginx에 대한 찬사)
하하하
uid는 사용자가 식별하는 uid입니다. 서비스에 대한 소켓 링크는 이 고유 ID를 통해서만 클라이언트에 메시지를 보낼 수 있습니다.