development

PHP와 함께 혜성을 사용하십니까?

big-blog 2020. 9. 25. 08:06
반응형

PHP와 함께 혜성을 사용하십니까?


PHP 백엔드를 사용하여 실시간 채팅을 구현하려고 생각했지만 혜성을 논의하는 사이트에서이 댓글을 보았습니다.

내 이해는 Comet은 각 브라우저 클라이언트에 대한 지속적인 연결을 유지하도록 요구하기 때문에 PHP는 Comet에게 끔찍한 언어라는 것입니다. mod_php를 사용하는 것은 전혀 확장되지 않는 각 클라이언트에 대해 아파치 자식을 풀 타임으로 묶는 것을 의미합니다. 내가 아는 사람들은 Comet 작업을하는 것으로 대부분 수백 또는 수천 개의 동시 연결을 처리하도록 설계된 Twisted Python을 사용하고 있습니다.

이것이 사실입니까? 아니면 구성 할 수있는 것입니까?


이미 말한 내용에 동의 / 확대하면 FastCGI가 문제를 해결할 수 없다고 생각합니다.

Apache

Apache에 대한 각 요청은 요청이 완료 될 때까지 하나의 작업자 스레드를 사용합니다. COMET 요청에는 시간이 오래 걸릴 수 있습니다.

Ajaxian에 대한 이 기사에서는 Apache에서 COMET을 사용하는 것에 대해 언급하고 있으며 이는 어렵다고합니다. 이 문제는 PHP에만 국한된 것이 아니며 Apache에서 사용하려는 모든 백엔드 CGI 모듈에 적용됩니다.

제안 된 해결책은 요청이 작업자 스레드로 전달되는 방식을 변경하는 '이벤트'MPM 모듈 을 사용하는 것 입니다.

이 MPM은 HTTP의 'keep alive 문제'를 수정하려고합니다. 클라이언트가 첫 번째 요청을 완료 한 후 클라이언트는 연결을 열린 상태로 유지하고 동일한 소켓을 사용하여 추가 요청을 보낼 수 있습니다. 이것은 TCP 연결을 생성 할 때 상당한 오버 헤드를 줄일 수 있습니다. 그러나 Apache는 전통적으로 전체 자식 프로세스 / 스레드가 클라이언트의 데이터를 기다리도록 유지하므로 자체 단점이 있습니다. 이 문제를 해결하기 위해이 MPM은 전용 스레드를 사용하여 Listening 소켓과 Keep Alive 상태에있는 모든 소켓을 처리합니다.

안타깝게도이 방법도 작동하지 않습니다 . 요청이 완료된 후에 만 '스누즈' 하여 클라이언트의 새 요청을 기다리기 때문입니다.

PHP

이제 문제의 다른 측면을 고려하면 comet 요청 당 하나의 스레드를 유지하는 문제를 해결하더라도 요청 당 하나의 PHP 스레드가 필요합니다. 이것이 FastCGI가 도움이되지 않는 이유입니다.

혜성 요청이 트리거 된 이벤트가 관찰 될 때 재개되도록 허용하는 Continuations 와 같은 것이 필요합니다 . AFAIK, 이것은 PHP에서 가능한 것이 아닙니다. Java에서만 본 적이 있습니다 . Apache Tomcat 서버를 참조하십시오 .

편집하다:

있다 기사는 여기 부하 분산 (사용에 대한 HAProxy를 당신이 아파치 서버와 같은 서버의 포트 80에서 혜성을 사용하는 서버 (예를 들어, 부두, 자바에 대한 바람둥이) 모두를 실행할 수 있도록).


Nginx 및 JavaScript를 사용하여 메모리 또는 CPU 사용률이 거의없이 매우 확장 가능한 Comet 기반 채팅 시스템을 구현할 수 있습니다.

여기에 여러분이 시작할 수있는 아주 간단한 예가 있습니다. NHPM 모듈로 Nginx 컴파일을 다루고 jQuery, PHP 및 Bash에서 간단한 게시자 / 구독자 역할에 대한 코드를 포함합니다.

http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/


PHP

나는 단순한 혜성을 설명하는 이 재미있는 작은 스크린 캐스트를 발견했습니다 . 부수적으로 나는 이것이 실제 부하에서 서버를 죽일 것이라고 정말로 생각합니다. 사용자가 두 명 뿐인 경우에는이 솔루션을 선택하겠습니다. 이 솔루션은 구현하기가 정말 간단합니다 (스크린 캐스트는 5 분만 소요됩니다. :)). 그러나 이전에 말했듯이 많은 동시 사용자에게 좋지 않다고 생각합니다 (벤치 마크해야합니다;)).

  1. 메모리에서 데이터를 가져 오는 것보다 훨씬 느린 파일 I / O를 사용합니다. 예를 들어 기능과 마찬가지로 filemtime(),
  2. 둘째, 그러나 최소한 PHP가 적절한 스레드 모델을 가지고 있지 않다고 생각합니다. PHP는 아무것도 공유하지 않는 모델 때문에 어쨌든 이것을 위해 설계되지 않았습니다 . 슬라이드에서 "공유 데이터는 데이터 저장소 계층으로 푸시 다운됩니다"라는 문구처럼 예를 들어 MySQL과 같습니다.

대안

혜성 / 긴 폴링을하고 싶다면 대안을 시도해야한다고 생각합니다. 예를 들어 다음과 같은 많은 언어를 사용할 수 있습니다.

  • 자바 / JVM : Jetty 연속 .
  • Python : 더스틴의 슬로 쉬 .
  • 얼랭 : 혜성 / 등의 인기 언어.
  • Lua, Ruby, C, Perl이 몇 가지 예입니다.

간단한 Google 검색을 수행하면 PHP도 많은 대안을 보여줄 것입니다 (큰 부하로 인해 서버가 죽을 것이라고 생각합니다).


mod_php는 PHP를 사용하는 유일한 방법이 아닙니다. fastcgi를 사용할 수 있습니다. PHP는 --enable-fastcgi.

FastCGI로서의 PHP : http://www.fastcgi.com/drupal/node/5?q=node/10


https://github.com/reactphp/react 를 시도 할 수도 있습니다.

React는 PHP의 이벤트 기반 프로그래밍을위한 저수준 라이브러리입니다. 핵심에는 이벤트 루프가 있으며, 그 위에 스트림 추상화, 비동기 DNS 해석기, 네트워크 클라이언트 / 서버, http 클라이언트 / 서버, 프로세스와의 상호 작용과 같은 저수준 유틸리티를 제공합니다. 타사 라이브러리는 이러한 구성 요소를 사용하여 비동기 네트워크 클라이언트 / 서버 등을 만들 수 있습니다.

이벤트 루프는 리액터 패턴 (따라서 이름)을 기반으로하며 EventMachine (Ruby), 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 서버를 구현하고 있습니다. 'phet'([ph] p com [et])라고합니다.

프로젝트 페이지 : http://github.com/Tim-Smart/phet

Free free to join in on development. I have currently managed to get most of the server logic done, just need to finish off the client side stuff.

EDIT: Recently added 'Multi-threading' capabilities using the pcntl_fork method :)


You'll have a hard time implementing comet in PHP, just because of it's inherent single-threaded-ness.

Check out Websync On-Demand - the service lets you integrate PHP via server-side publishing, offloading the heavy concurrent connection stuff, and will let you create a real-time chat app in no time.


A new module just came out for the nginx web server that'll allow Comet with any language, including PHP.

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/


You will have to create your own server in PHP. Using Apache/mod_php or even fastcgi will not scale at all. A few years old, but can get you started:

PHP-Comet-Server: http://sourceforge.net/projects/comet/


I think this is more an issue that having a lot of apache threads running all the time is a problem. That will existing with any language if it works via apache in the same way as PHP (usually) does.

참고URL : https://stackoverflow.com/questions/603201/using-comet-with-php

반응형