2016-08-08 2 views
1

래칫 PHP를 사용하여 웹 소켓 연결을 생성했습니다. 나는 클라이언트를 연결하고 쿼리를 실행했다. (쿼리를 실행하는데 약 20 초가 걸릴 것이다.) 다른 클라이언트를 연결하려고 할 때 웹 소켓 연결이 보류 상태에 있음을 알았다. . 나중에 초기 요청에 대한 응답이 왔을 때 서버가 '새 연결이 설정되었습니다'라는 메시지를 표시합니다 (내 onOpen 함수에서이 문을 유지함).래칫 이벤트 루프가 막혔습니다

반응 PHP가 NodeJ와 같은 원리로 작동하면 처리에 많은 시간이 걸리더라도 연결이 이루어지지 않아야합니까?

나중에 실행 부분 때문에 웹 소켓 연결이 차단되는 이유는 무엇입니까?

답변

0

글쎄, 완전히 정확하지는 않습니다. 래칫 PHP와 NodeJS는 포드 (pod)의 완두콩이 아닙니다. 그들은 똑같은 방식으로 작동하지 않습니다.

래칫 PHP는 논 블로킹 입출력 스트림을 사용합니다. 이것은 WS 서버에 대한 TCP/IP 연결에서 프레임 워크에 의해 촉진되는 다른 IO 연결에 이르기까지 모든 것입니다.

그러나 데이터베이스 쿼리라고 가정하는 쿼리를 실행 중이라고하셨습니까? Ratchet의 비 차단 IO 스트림 기능을 통하지 않고이 데이터베이스에 직접 연결을 설정 한 경우 차단 TCP/UNIX 소켓을 통해 데이터베이스 쿼리가 발생합니다. 즉, PHP 에 있어야하며 더 많은 코드를 계속 실행하려면 dbms가 쿼리에 응답 할 때까지 기다려야합니다. 따라서 WebSocket 서버가 다른 요청에 응답 할 수 없거나 TCP 소켓이 WAIT 상태이므로 해당 데이터베이스 시스템이 응답 할 때까지 다른 연결을 수락하거나 다른 코드 행을 실행합니다. 그것은 단지 데이터가 파이프를 기다리는 것을 기다리고 앉아있는 것입니다.

+1

그래서 데이터베이스 연결을 직접하는 대신 비 차단 IO 스트림 기능을 어떻게 사용합니까? – TheStoryCoder

관련 문제