PHP와 함께 comet을 사용하시겠습니까?
저는 PHP 백엔드를 사용하여 실시간 채팅을 구현하려고 생각했지만, 이 코멘트를 우연히 논의하는 사이트에서 발견했습니다.
Comet에서는 각 브라우저 클라이언트에 대해 지속적인 접속을 열어둘 필요가 있기 때문에 PHP는 Comet에게 끔찍한 언어라고 알고 있습니다.mod_php를 사용하면 확장성이 전혀 없는 각 클라이언트에 대해 Apache 자식을 풀타임으로 연결할 수 있습니다.제가 아는 사람들은 대부분 트위스트 파이썬을 사용합니다. 트위스트 파이썬은 수백, 수천 개의 동시 접속을 처리할 수 있도록 설계되어 있습니다.
정말이에요?아니면, 그 주위에 설정할 수 있는 것입니까?
이미 말한 내용에 동의/확장해도 Fast CGI로는 문제가 해결되지 않을 것으로 생각합니다.
아파치
Apache에 대한 각 요청은 요청이 완료될 때까지 하나의 워커 스레드를 사용합니다.이것은 COME 요청에는 긴 시간이 걸릴 수 있습니다.
Ajaxian에 관한 이 기사에서는 Apache에서 COMET을 사용하는 것은 어렵다고 언급하고 있습니다.이 문제는 PHP에만 국한된 것이 아니며 Apache에서 사용하는 모든 백엔드 CGI 모듈에 적용됩니다.
권장되는 해결책은 '이벤트' MPM 모듈을 사용하여 워커 스레드에 요청을 발송하는 방법을 변경하는 것이었습니다.
이 MPM은 HTTP의 '킵얼라이브 문제'를 수정하려고 합니다.클라이언트는 첫 번째 요구가 완료되면 접속을 열어두고 같은 소켓을 사용하여 추가 요청을 전송할 수 있습니다.이것에 의해, TCP 접속의 작성에 있어서의 중요한 오버헤드를 절약할 수 있습니다.그러나 Apache는 전통적으로 전체 하위 프로세스/스레드를 클라이언트로부터 데이터를 기다리는 상태로 유지하며, 이로 인해 자체적인 단점이 있습니다.이 문제를 해결하기 위해 이 MPM은 전용 스레드를 사용하여 Listening 소켓과 Keep Alive 상태에 있는 모든 소켓을 처리합니다.
유감스럽게도 이것도 동작하지 않습니다.요구가 완료된 후에만 snoze(스누즈)되기 때문에 클라이언트의 새로운 요청을 기다리면 됩니다.
PHP
이 문제의 다른 측면을 고려하면, 요청당 1개의 스레드를 유지하는 문제를 해결하더라도 요청당 1개의 PHP 스레드가 필요합니다.이것이 FastCGI가 도움이 되지 않는 이유입니다.
혜성 요청이 트리거된 이벤트가 관찰되었을 때 요청을 재개할 수 있는 Continuations(계속)와 같은 것이 필요합니다.AFAIK, 이것은 PHP에서는 가능하지 않습니다.Java에서만 볼 수 있었습니다. Apache Tomcat 서버를 참조하십시오.
편집:
여기에서는 로드 밸런서(HAProxy)를 사용하여 동일한 서버의 포트 80에서 Apache 서버와 Comet 지원 서버(예: jetty, Java용 Tomcat)를 모두 실행할 수 있도록 하는 방법에 대해 설명합니다.
Nginx와 JavaScript를 사용하여 메모리나 CPU 사용률이 거의 없는 매우 확장성이 뛰어난 Comet 기반 채팅 시스템을 구현할 수 있습니다.
시작할 수 있는 매우 간단한 예가 있습니다.NHPM 모듈로 Nginx를 컴파일하고 jQuery, PHP 및 Bash에서 단순한 퍼블리셔/서브스크라이버 역할용 코드를 포함합니다.
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/
PHP
간단한 혜성에 대해 설명하는 재미있는 작은 스크린캐스트를 찾았어요.참고로, 이것은 실제 부하가 걸려도 서버를 완전히 정지시킬 수 있다고 생각합니다.사용자가 몇 명 있는 경우라면 이 솔루션을 사용하는 것이 좋습니다.이 솔루션은 구현이 매우 간단합니다(스크린캐스트는 5분밖에 걸리지 않습니다).하지만 앞서 말씀드린 바와 같이 많은 동시 사용자에게는 좋지 않다고 생각합니다(벤치마크해야 할 것 같습니다).
- 메모리에서 데이터를 가져오는 것보다 훨씬 느린 파일 I/O를 사용합니다., 함수 「」가 .
filemtime()
, - 둘째, 하지만 적어도 PHP는 괜찮은 스레드 모델을 가지고 있지 않다고 생각합니다.Share nothing 모델 때문에 PHP는 이를 위해 설계되지 않았습니다.예를 들어 MySQL과 같이 "공유 데이터가 데이터 저장소 계층으로 푸시 다운됩니다."라고 슬라이드에 나와 있습니다.
대체 수단
만약 당신이 어떤 혜성/장기 투표를 하고 싶다면 다른 대안을 시도해봐야 한다고 생각합니다.다음과 같은 여러 언어를 사용할 수 있습니다.
간단한 구글 검색을 실행하는 것만으로 PHP도 많은 대안을 볼 수 있습니다(큰 부하가 걸리면 서버가 망가질 것 같습니다).
PHP를 사용하는 방법은 mod_php뿐만이 아닙니다.fastcgi를 사용할 수 있습니다.PHP는 다음과 같이 컴파일해야 합니다.--enable-fastcgi
.
Fast CGI로서의 PHP: http://www.fastcgi.com/drupal/node/5?q=node/10
https://github.com/reactphp/react 에 접속할 수도 있습니다.
React는 PHP에서 이벤트 기반 프로그래밍을 위한 낮은 수준의 라이브러리입니다.그 핵심에는 이벤트 루프가 있으며, 그 위에 스트림 추상화, 비동기 DNS 해결기, 네트워크 클라이언트/서버, http 클라이언트/서버, 프로세스와의 상호작용과 같은 낮은 수준의 유틸리티를 제공합니다.서드파티 라이브러리는 이러한 컴포넌트를 사용하여 비동기 네트워크 클라이언트/서버 등을 작성할 수 있습니다.
이벤트 루프는 리액터 패턴(따라서 이름)을 기반으로 하며 Event Machine(루비), Twisted(Python), Node.js(V8) 등의 라이브러리에서 강하게 영감을 받습니다.
첫 번째 예에서는 포트 1337에서 단순한HTTP 서버가 리슨하고 있습니다.
<?php
$i = 0;
$app = function ($request, $response) use (&$i) {
$i++;
$text = "This is request number $i.\n";
$headers = array('Content-Type' => 'text/plain');
$response->writeHead(200, $headers);
$response->end($text);
};
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);
$http->on('request', $app);
$socket->listen(1337);
$loop->run();
저도 비슷한 문제가 있어요.흥미로운 옵션 중 하나는 cometd-java나 cometd-python과 같은 기존 Comet 서버를 핵심 메시지 허브로 사용하는 것입니다.그러면 PHP 코드는 Comet 서버에 대한 클라이언트일 뿐이며, 다른 클라이언트와 마찬가지로 채널에서 메시지를 게시하거나 읽을 수 있습니다.
여기에 링크된 흥미로운 코드 조각이 있습니다. http://morglog.org/?p=22=1. 이 메서드의 일부를 구현합니다(디버깅코드의 비트가 주위에 분산되어 있지만).
현재 소켓 기능을 사용하여 확장 가능한 PHP Comet 서버를 구현하고 있습니다.그것은 '펫'([ph]p com[et])이라고 불린다.
프로젝트 페이지: http://github.com/Tim-Smart/phet
개발에 무료로 참여하실 수 있습니다.현재 서버 로직의 대부분을 완료했습니다.클라이언트측 작업만 끝내면 됩니다.
편집: 최근 추가된 멀티스레딩 기능은pcntl_fork
메서드:)
Comet을 PHP에 구현하는 것은 매우 어렵습니다.단순 스레드화 되어 있기 때문입니다.
Websync On-Demand 확인 - 이 서비스는 서버 측 퍼블리싱을 통해 PHP를 통합할 수 있으며, 무거운 동시 접속을 오프로드하여 실시간 채팅 앱을 즉시 만들 수 있습니다.
Comet은 PHP를 포함한 모든 언어로 사용할 수 있는 nginx 웹 서버를 위한 새로운 모듈이 방금 출시되었습니다.
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
PHP에서 자체 서버를 생성해야 합니다.Apache/mod_php 또는 fastcgi를 사용하면 확장이 전혀 되지 않습니다.몇 살이지만 시작할 수 있습니다.
PHP-Comet-Server: http://sourceforge.net/projects/comet/
많은 아파치 스레드를 항상 실행하는 것이 문제라는 것이 더 큰 문제라고 생각합니다.PHP(통상)와 같은 방법으로 Apache를 통해 동작하는 경우에는 어떤 언어에서도 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/603201/using-comet-with-php
'programing' 카테고리의 다른 글
jquery 또는 javascript를 사용하여 객체 배열을 정렬하는 방법 (0) | 2022.09.23 |
---|---|
문자 목록을 문자열로 변환 (0) | 2022.09.23 |
NodeJS + ExpressJS에서 mysql DB에 대한 연결을 관리하는 올바른 방법 (0) | 2022.09.23 |
MySQL "wait_timeout"이 긴 쿼리에 적용되지 않습니까? (0) | 2022.09.23 |
정수 불변 (0) | 2022.09.23 |