우리 회사의 ERP에서 긴 폴링 기반 알림 서비스를 구현하려고합니다. Facebook 알림과 비슷합니다. 사용Ajax와 PHP로 긴 폴링 - 아파치 동결
기술 :
- PHP 60 초
timeout
세트와 반복 될 때마다 1 초로sleep
. - jQuery for AJAX handling.
- 웹 서버로 아파치.
코딩 거의 한 달 후, 우리는 생산에 갔다. 배포 후 몇 분 후에 모든 것을 롤백해야했습니다. 우리 서버 (8 코어)는 ~ 5 개의 브라우저 탭을 사용하여 20 명의 직원으로부터의 긴 요청을 처리 할 수 없다는 것이 밝혀졌습니다. 예 : 사용자가 ERP로 3 개의 탭을 열었습니다. 각 탭에는 하나의 긴 폴링 AJAX가 있습니다. 4 번 탭을 열면 불가능합니다. 이전 3 번 중 하나가 죽을 때까지 중단됩니다 (따라서 AJAX가 중지됩니다).
'Apache 제한'이라고 생각했습니다. 그래서 우리는 인터넷 검색을 시작했습니다. 아파치의 MPM 모듈과 설정에 대한 정보를 찾았습니다. 우리 서버는 prefork
MPM을 사용합니다. apachectl -l
이 표시되어 있습니다. 그래서 config에서 몇 줄을 다음과 같이 바 꾸었습니다.
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 16
MaxSpareServers 32
ServerLimit 50%
MaxClients 150
MaxClients 50%
MaxRequestsPerChild 0
</IfModule>
재미있는 점은 비슷한 구성의 내 로컬 컴퓨터에서도 작동한다는 것입니다. 서버에서는 MinSpareServers
을 16으로 설정하면 아파치가 config를 무시하는 것처럼 보입니다. 다시 시작한 후 8이됩니다. Whe는 무엇을해야할지 모른다. 이전 게시물의 첫번째 코멘트에
그럴 가능성은 없지만 [서버 당 최대 영구 연결 제한] (http://stackoverflow.com)/a/985704/570812)를 여러 브라우저에서 구현했습니다. 4 번째 탭이 연결된 직원 수에 상관없이 테스트를 수행 할 수 있습니다. – Passerby
아파치/PHP 스레드를 잠그는 페이지를 잠들지 마십시오. 아파치 작업자 등을 늘리고 모든 쓰레기를 처리해야합니다. 내 CRM 플랫폼에서는 사용자 ID별로 간단한 텍스트 파일 검색을 수행합니다. 마지막 체크의 타임 스탬프와 현재의 타임 스탬프가 다른 경우> 60이면 폴링을 수행하고 아무 것도하지 않습니다. 매초마다 실행되도록 스크립트를 설정하십시오. – Dave
Python을 통해 webSock을 사용해보십시오. –