2012-03-16 3 views
2

아파치는 요청이 완료 될 때까지 아파치에 대한 각 요청이 하나의 작업자 스레드를 사용하기 때문에 긴 폴링 요청을 처리하는 데 적합하지 않습니다. 이는 긴 폴링/COMET 요청에 오랜 시간이 걸릴 수 있습니다.소켓 연결은 하나의 스레드 만 필요합니까?

하지만 소켓 연결은 어떻게됩니까? PHP 웹 사이트에서 an example"실제로 작동하는 PHP로 작성된 간단한 멀티 클라이언트 서버"인 것 같습니다..

내 질문 : 그러한 소켓 서버는 모든 기존 연결에 대해 하나의 작업자 스레드 만 사용합니까? 그리고 반대의 경우는 : 하나의 작업자 스레드 만 사용하여 여러 소켓 서버에 동시에 연결되는 PHP 클라이언트를 작성할 수 있습니까?

답변

3

phpDaemon을 살펴보십시오. 그것은 long-pool 어플리케이션과 비슷한 것을 디자인합니다. 그러나 가능하면이 작업을 위해 node.js를 사용하는 것이 좋습니다.

+2

이 라이브러리의 라이센스는 무엇입니까? 난 그게 양말을 지원하는 것을 볼 수 있습니다, 그것은 소켓 연결을 처리 할 수 ​​있습니까? – HomeCoder

+1

phpDaemon에서 모든 프로토콜은 간단한 소켓 연결을 기반으로합니다. 직접 사용하거나 확장 할 수 있습니다. 이 예제를 참조하십시오. https://github.com/kakserpom/phpdaemon/tree/master/app-servers 프로젝트에는 라이센스에 대한 정보가 없습니다. [작성자] (https://github.com/kakserpom)에게 문의하십시오. –

3

폴링 루프 스타일 서버의 예입니다. socket_recv()에 전달되는 MSG_DONTWAIT 상수를 참조하십시오. 본질적으로 모든 열린 소켓을 순환하여 하나의 스레드가 대기중인 데이터인지 확인하는 단일 스레드가 있습니다. 소켓에 대기중인 데이터가 없으면 다음 대기열로 이동하여 확인합니다.

그러나 이러한 서버에서는 TCP 기반 이외의 멋진 프로토콜 처리를 얻지 못합니다. 원시 데이터 스트림을 직접 파싱하는 것에 대해 걱정해야합니다.

+2

"프로토콜 처리"란 무엇을 의미합니까, 한 두 문장으로 (초보자 용) 설명 할 수 있습니까? – HomeCoder

+0

일반적인 웹 서버에서는 HTTP 헤더 등을 파싱하는 것과 같은 작업을 자동으로 수행합니다. 소켓을 사용하면 원시 바이트 스트림 만 얻을 수 있습니다. 그 바이트가 의미하는 것은 당신에게 달려 있습니다. – Amber

3

모든 연결은 소켓으로 이루어집니다. 주요 차이점은 I/O가 차단되는지 여부입니다. 블럭이있는 소켓에서 수신을 선택하면 스레드가 차단되지만 MSG_DONTWAIT을 사용하면 즉시 완료됩니다.

Apache는 이와 관련하여 몇 가지 옵션을 제공합니다. 동시 연결 (mpm-prefork)을 위해 분기하거나, 각 연결 (mpm-worker)마다 다른 스레드를 사용하거나, 비 차단 I/O (mpm-event)가있는 스레드를 사용할 수 있습니다.