lang/php

Workerman Socket Server, Multi Process 및 libevent 폴링 라이브러리

C/H 2018. 6. 1. 18:23

프레임워크라는 틀을 무시하면, Workerman 이 속도, 기능(Websocket 서버)에 굉장한 매력이 있다.

워크맨

workerman은 고성능 PHP 소켓 서버 프레임 워크로, PHP 다중 프로세스 및 libevent 이벤트를 기반으로 라이브러리를 폴링합니다. PHP 개발자는 하나 또는 두 개의 인터페이스를 구현하는 한 Rpc 서비스, 채팅 서버와 같은 자체 웹 응용 프로그램을 개발할 수 있습니다. 모바일 게임 서버 등등.

workerman의 목표는 PHP 개발자가 PHP 소켓 및 PHP 다중 프로세스 세부 정보를 이해하지 않고도 고성능 소켓 기반 응용 프로그램 서비스를보다 쉽게 ​​개발할 수 있도록하는 것입니다. workerman 자체는 PHP 프로세스 관리 및 소켓 통신 모듈을 사용하는 PHP 다중 프로세스 서버 프레임 워크이므로 php-fpm, nginx 또는 apache 컨테이너에 의존하지 않고 독립적으로 실행할 수 있습니다.

Workerman의 기능

구글 번역기를 이용한 발 번역...

순수한 PHP 개발
workerman은 PHP 개발을 전적으로 사용하며, workerman을 사용하여 개발 된 어플리케이션은 php-fpm, apache 및 nginx 컨테이너에 의존하지 않고 독립적으로 실행할 수 있습니다. 따라서 PHP 개발자는 응용 프로그램을 쉽게 개발, 배포 및 디버깅 할 수 있습니다.
PHP 다중 프로세스 지원
서버 멀티 CPU 성능을 최대로 발휘하기 위해 기본적으로 워크맨은 멀티 프로세스 멀티 태스킹을 지원합니다. 메인 코스와 서비스를 제공하기 위해 자식 프로세스의 수, 자식 프로세스 종료 신호를 모니터링하기위한 책임이있는 주요 공정을 열고, 그래서 단지 응용 프로그램의 성능이 향상되지하고, 서비스를 처리하기 위해 새로운 자식 프로세스 생성을 담당하고 workerman 더 안정하게 workerman.
TCP, UDP 지원
워크맨은 TCP 및 UDP 전송 계층 프로토콜을 모두 지원하며 구성의 한 필드 만 변경해야하며 전송 계층 프로토콜은 대체 될 수 있습니다. 서비스 코드는 변경할 필요가 없습니다.
긴 연결을 지원합니다.
많은 경우 PHP 응용 프로그램은 대화방, 게임 등과 같이 클라이언트와 긴 연결을 유지해야합니다. 그러나 기존의 PHP 컨테이너 (apache, nginx, php-fpm)는이를 수행하기 어렵습니다. workerman을 사용하면 긴 PHP 연결을 쉽게 사용할 수 있습니다. PHP는 단일 프로세스가 수천 또는 수만 개의 동시 연결을 지원할 수 있으므로 다중 프로세스는 수십만 개 또는 수백만 개의 동시 연결을 지원할 수 있습니다.
다양한 응용 프로그램 계층 프로토콜 지원
이 인터페이스는 맞춤형 프로토콜을 비롯한 다양한 애플리케이션 계층 프로토콜을 지원합니다. Workerman은 기본적으로 HTTP, WebSocket 및 간단한 텍스트 텍스트 프로토콜을 지원합니다. 동시에 Workerman은 공통 프로토콜 인터페이스를 제공하므로 개발자는이 인터페이스를 기반으로 자신의 프로토콜을 쉽게 개발할 수 있습니다.
높은 동시성 지원
workerman은 Libevent 이벤트 폴링 라이브러리 ( Libevent 확장 을 설치해야 함)를 지원합니다 .Libevent 는 높은 동시성으로 매우 잘 수행됩니다 .Libevent가 설치되어 있지 않은 경우 PHP의 내장 관련 Select 시스템 호출을 사용하십시오.
원활한 서비스 재개 지원
이 서비스 (예 : 릴리스 버전 등), 우리는 사용자 요청 프로세스가 즉시 종료 처리하지 않으려는 다시 시작해야하지만 순간을 다시 시작하지 않으려면 언제든지 충분한 프로세스가 외부 제공 있다는 것을 확인하기 위해, 서비스를 제공하기에 충분한 진전이 없다 서비스는, 당신은 부드러운 restart 명령, workerman 메이크업 자식 프로세스가 종료 요청이 처리 된 후 다시 시작의 원활한 처리를 사용할 수 있으며, 외부 서비스의 과정 중 언제든지 충분이 있는지 확인 할 수 있습니다.
HHVM 지원
HHVM에 대한 지원은 특히 CPU 집약적 인 작업에서 PHP 성능이 크게 향상됩니다 (일반적으로 약 50 % 또는 그 이상). 실제 스트레스 테스트에는 상당한 성능 향상이 있습니다.
지정된 사용자로 하위 프로세스 실행 지원
자식 프로세스는 실제로 사용자 요청을 처리하는 프로세스이므로 보안상의 이유로 하위 프로세스가 너무 높은 권한을 가질 수 없기 때문에 Workerman은 자식 실행 프로세스를 실행하는 사용자 설정을 지원합니다.
모니터링 기능 포함
통계 할 수있는 내부 모니터링 통계 모듈 workerman은 이러한 프로세스가 종료하고, 각 프로세스의 메모리 크기의 종료 상태와 듣기 IP 포트, 서비스 이름을 시작하는 각 프로세스 시간, 실행중인 프로세스, 각 등의 자체 데이터의 일부를 workerman 프로세스는 요청 수, 연결 수, 패킷 전송 실패 수 등을 처리합니다. 이 정보는 php start.php status로컬에서 실행하고 로컬에서 볼 수 있습니다.
밀리 초 타이머 지원
게임의지도에서 AI 관련 계산과 같은 예약 된 작업이나 예약 된 계산에 사용할 수있는 밀리 초 레벨 타이머를 지원합니다.
비동기 IO 지원
Workerman의 자체 네트워크 IO 인터페이스는 비동기식이며 개발자는 이벤트 기반 비동기 프로그래밍을 구현할 수 있습니다.
객체 또는 자원을 영원히 지원하십시오.
활성의 파괴없이 처리주기 고정 부재 또는 전역 변수가 영구히 유지되고, 즉 정적 부재의 초기화 또는 현재 프로세스의 수명주기 동안 모든 요청이 정적 재사용 할 수있는 전역 변수만큼 인 회원 또는 전역 변수. 예를 들어, 한 단일 프로세스 내에서 데이터베이스 연결을 초기화로,이 과정의 모든 미래의 요청이 데이터베이스를 다시 연결하지 사용자 별 요청을 데이터베이스 연결을 재사용 할 수 있으며, TCP 세 방향 핸드 셰이크 중에 자주를 피하기 위해 데이터베이스 연결, 데이터베이스 사용 권한 검증 연결 해제 중 TCP 4 방향 핸드 셰이크는 응용 프로그램의 효율성을 크게 향상시킵니다. memcache 및 redis와 같은 초기화에 대해서도 마찬가지입니다.
고성능
PHP 파일은 첫 번째, 영구 메모리가 될 크게 디스크 IO 및 PHP 요청 초기화를 줄이고, 당신이 직접 메모리 연산 코드를 사용하여 다음 번 사용 후 해결하기 위해 디스크에서 읽을되기 때문에, 실행 환경을 만들어, 어휘 분석, 구문 분석, 오피 코드의 컴파일, 많은 오프 요청이 소요되는 프로세스 및 nginx를 아파치 및 기타 용기 등의 nginx PHP와 같은 컨테이너 덜 네트워크 오버 헤드 통신을 의존하지 않고는, 가장 중요한 자원이 영구적으로 남아 있고, 그래서 항상 데이터베이스 연결을 초기화하지 않을 수 있습니다 그래서 workerman을 사용하여 응용 프로그램을 개발하면 성능이 매우 높습니다.
많은 응용 프로그램
workerman는 같은 많은 응용 프로그램을 가지고 드리프트-RPC , JSON-RPC , 객실 채팅 , 통계 모니터링 서비스 및 웹 사이트 절차를. 현재 workerman에서 회사의 숫자에 의해 사용되었다, 그들 중 많은 하루 매출 수십억 달러의 전자 상거래 회사는 고객의 주문을 대형 게임 회사를위한 게임 백 스테이지 개발뿐만 아니라 시스템 개발.
분산 배포 지원
WorkerMan은 서비스 품질을 저하시키지 않으면 서 서버를 줄이기 위해 원활하게 추가 할 수있는 분산 배치를 지원합니다. 이를 통해 WorkerMan 클러스터는 중요한 처리량 또는 동시 TCP 연결을 지원할 수 있습니다.
하트 비트 감지 지원
게이트웨이 / 작업자 개발 모델은 서버 측에서 하트 비트 탐지를 지원하며 주기적으로 클라이언트에 응용 프로그램 계층 하트 비트를 보내고 적시에 클라이언트의 극단적 인 연결 끊김 (전원 장애, 갑작스러운 네트워크 장애 등)을 감지 할 수 있습니다.

Requires

  • PHP 5.3 or Higher
  • A POSIX compatible operating system (Linux, OSX, BSD)
  • POSIX and PCNTL extensions for PHP

Basic Usage

A websocket server
PHP Websocket Server
An http server
.
A WebServer
.
A tcp server
.
Enable SSL
.
Custom protocol
.
Timer
.
AsyncTcpConnection (tcp/ws/text/frame etc...)
.
Async Mysql of ReactPHP
composer require react/mysql
Async Redis of ReactPHP
composer require clue/redis-react
Aysnc dns of ReactPHP
composer require react/dns
Http client of ReactPHP
composer require react/http-client
ZMQ of ReactPHP
composer require react/zmq
STOMP of ReactPHP
composer require react/stomp

workerman 개발자가 알아야 할 몇 가지 문제

  1. workerman 아파치 또는 nginx에 의존하지 않습니다

    workerman 자체는 이미 apache/nginx와 같은 컨테이너입니다.
    정상적인 PHP 환경에서 workerman을 실행할 수 있습니다.

  2. workman은 Coammand Line(CLI)에서 시작됩니다.

    시작 모드는 Apache 시작 명령과 비슷합니다 (일반적으로 webspace는 workerman을 사용할 수 없습니다).

  3. 장기 연결은 하트 비트에 추가되어야합니다 긴 연결은 하트 비트를 추가해야합니다, 긴 연결은 하트 비트를 추가해야합니다, 긴 연결은 하트 비트를 추가해야합니다, 중요한 단어는 세 번 말한다.

    오랫동안 통신하지 않는 장거리 연결은 확실히 방화벽에 의해 연결이 끊어집니다.
    하트 비트가없는 긴 연결 응용 프로그램은 보스 KO를 기다립니다.
    Workerman 하트 비트 설명, gatewayWorker 하트 비트 설명

  4. 클라이언트와 서버 프로토콜은 통신 할 수 있어야합니다. 이것은 개발자에게 매우 공통적 인 문제입니다.

    예를 들어, 클라이언트는 websocket 프로토콜을 사용하며 서버는 통신 할 수 있도록 websocket 프로토콜 (서버 workerman( 'websocket : //0.0.0.0 ...')이어야합니다.
    브라우저 주소 표시 줄의 websocket 프로토콜 포트에 액세스하지 마십시오. webscoket 프로토콜을 사용하여 베어 TCP 프로토콜 포트에 액세스하지 마십시오. 프로토콜이 일치해야합니다.
    이 원칙은 영어를 사용하는 사람들과 의사 소통을하고 영어를 사용하려는 경우 비슷합니다. 일본어로 의사 소통하고 싶다면 일본어를 사용하십시오.
    이 언어는 사용권 계약과 유사합니다. 양 당사자 (클라이언트와 서버)는 동일한 언어를 사용하여 통신해야하며 그렇지 않으면 통신 할 수 없습니다.

  5. 연결 실패 이유

    가능한 연결 실패 원인 workerman을 사용하기 시작할 때 공통적으로 발생하는 문제 중 하나는 클라이언트가 서버에 연결하지 못하는 것입니다. 이유는 일반적으로 다음과 같습니다.

    1. 서버 방화벽 (클라우드 서버 보안 그룹 포함)이 연결을 차단했습니다 (50 % 확률)
    2. 클라이언트와 서버가 사용하는 일관되지 않은 프로토콜 (30 %의 가능성)
    3. ip 또는 포트가 잘못되었습니다 (15 % 확률)
    4. 서버가 시작되지 않았습니다.

  6. exit die sleep 문을 사용하지 마십시오.

    비즈니스에 의한 exit, die 명령문을 실행하면 프로세스가 종료되고 WORKER EXIT UNEXPECTED 오류가 표시됩니다.
    물론 프로세스가 종료되면 서비스를 계속하기 위해 즉시 새 프로세스를 다시 시작합니다.
    당신이 돌아 가야 할 경우, 당신은 return을 호출 할 수 있습니다.
    sleep 문은 프로세스를 잠자기 상태로 만들며, 잠자는 동안 어떤 비즈니스도 수행하지 않고, 프레임 워크가 실행을 멈추고, 프로세스에 대한 모든 클라이언트 요청이 처리되지 않게합니다.

  7. 비즈니스 코드에 무한 루프가 없어야 합니다.

    비즈니스 코드에 무한 루프가 없어야합니다. 그렇지 않으면 제어 권한이 워크맨 프레임 워크에 반환 될 수 없게되어 다른 클라이언트 메시지를 수신 할 수 없게됩니다.

  8. 다시 시작하도록 코드 변경

    workerman은 메모리 상주 프레임 워크이며 새로운 코드의 효과를보기 위해 workerman을 다시 시작하도록 코드를 변경합니다.

  9. 긴 연결 응용 프로그램은 GatewayWorker 프레임 워크를 사용하는 것이 좋습니다.

    많은 개발자가 workerman을 사용하여 인스턴트 메시징, Internet of Things 등과 같은 긴 연결 응용 프로그램을 개발합니다.
    긴 연결 응용 프로그램은 GatewayWorker 프레임 워크를 직접 사용하는 것이 좋습니다.
    작업자를 기준으로 다시 패키지되며 긴 연결 응용 프로그램에 사용하기 쉽습니다.

  10. 더 높은 동시성 지원

    비즈니스 동시 연결 수가 온라인 상에 1,000 개가 넘는 경우 Linux 커널을 최적화하고, 이벤트 확장 또는 libevent 확장을 설치하십시오.


Ab Test Result

동접 10, 요청 10,000 ab 테스트 결과

  1. Workerman 3.5.9 : 0.157 [ms] (mean) -- 왜 이럴까? ㅡ.ㅡa
  2. PHP 7.2.5 : 1.739 [ms] (mean)
  3. ReactPHP : 1.943 [ms] (mean)
  4. Phalcon 3.3.2 : 4.033 [ms] (mean)
  5. CodeIginter 3.1.8 : 6.287 [ms] (mean)
  6. Laravel5.6.23 : 85.444 [ms] (mean)

PHPSocket.IO에서 PHP를 이용한 채팅 데모를 확인 할 수 있다.


반응형