Workerman의 특성

1. 순수 PHP 개발

Workerman으로 개발된 애플리케이션은 php-fpm, apache, nginx와 같은 컨테이너에 의존하지 않고 독립적으로 실행될 수 있습니다. 이로 인해 PHP 개발자가 애플리케이션을 개발, 배포 및 디버깅하는 것이 매우 편리합니다.

2. PHP 다중 프로세스 지원

서버의 다중 CPU 성능을 최대한 활용하기 위해 Workerman은 기본적으로 다중 프로세스 다중 작업을 지원합니다. Workerman은 하나의 마스터 프로세스와 여러 개의 자식 프로세스를 생성하여 외부 서비스 제공합니다. 마스터 프로세스는 자식 프로세스를 모니터링하고 자식 프로세스는 독립적으로 네트워크 연결을 수신하고 데이터 송수신 및 처리합니다. 프로세스 모델이 간단하여 Workerman은 더욱 안정적이고 효율적입니다.

3. TCP 및 UDP 지원

Workerman은 TCP와 UDP 두 가지 전송 계층 프로토콜을 지원합니다. 단지 하나의 속성만 변경하면 전송 계층 프로토콜을 변경할 수 있으며, 비즈니스 코드는 변경할 필요가 없습니다.

4. 긴 연결 지원

많은 경우 PHP 애플리케이션은 클라이언트와 긴 연결을 유지해야 합니다. 예를 들어 채팅룸, 게임 등이 있습니다. 그러나 전통적인 PHP 컨테이너(또는 apache, nginx, php-fpm)는 이를 구현하기 어렵습니다. Workerman을 사용하면 서버 쪽 비즈니스가 연결 종료 인터페이스를 호출하지 않는 한 PHP의 긴 연결을 사용할 수 있습니다. Workerman의 단일 프로세스는 수만 개의 동시 연결을 지원할 수 있으며, 다중 프로세스는 수십만 심지어 백만 개의 동시 연결을 지원합니다.

5. 다양한 애플리케이션 계층 프로토콜 지원

Workerman 인터페이스는 다양한 애플리케이션 계층 프로토콜을 지원하며, 사용자 정의 프로토콜도 가능합니다. Workerman에서 프로토콜을 변경하는 것도 매우 간단하며, 단지 하나의 필드를 구성하면 프로토콜이 자동으로 전환됩니다. 비즈니스 코드는 제로 변경으로, 심지어 여러 다른 프로토콜의 포트를 열어 다양한 클라이언트 요구를 충족할 수 있습니다.

6. 높은 동시 처리 지원

Workerman은 Libevent 이벤트 폴링 라이브러리를 지원합니다(이벤트 확장 설치 필요). Event를 사용하면 긴 연결의 높은 동시 처리 시 성능이 매우 뛰어납니다. 만약 Event 확장이 설치되지 않았다면 PHP 내장 Select 관련 시스템 호출을 사용하여 성능도 매우 우수합니다.

7. 서비스 부드러운 재시작 지원

서비스를 재시작해야 할 때(예: 버전 배포), 사용자 요청을 처리하고 있는 프로세스가 즉시 종료되기를 원하지 않으며, 재시작 순간에 클라이언트 통신이 실패하는 것을 원하지 않습니다. Workerman은 부드러운 재시작 기능을 제공하여 서비스의 부드러운 업그레이드를 보장하며, 클라이언트 사용에 영향을 미치지 않습니다.

8. 파일 업데이트 감지 및 자동 로드 지원

개발 과정에서 코드 변경 후 즉시 효과를 확인하고 싶습니다. Workerman은 FileMonitor 파일 모니터링 구성 요소를 제공하여 파일이 업데이트되면 Workerman이 자동으로 reload를 실행하여 새로운 파일을 로드하여 효과가 발생하도록 합니다.

9. 지정된 사용자로 자식 프로세스 실행 지원

자식 프로세스는 실제로 사용자 요청을 처리하는 프로세스이므로, 보안을 위해 자식 프로세스는 너무 높은 권한을 가질 수 없습니다. 따라서 Workerman은 자식 실행 프로세스를 실행할 사용자를 설정할 수 있도록 지원하여 서버의 보안을 더욱 강화합니다.

10. 객체 또는 리소스 영구 유지 지원

Workerman은 실행 과정에서 PHP 파일을 단 한 번 로드 및 분석하고, 그 후 메모리에 상주합니다. 이로 인해 클래스 및 함수 선언, PHP 실행 환경 및 심볼 테이블 등이 반복하여 생성 및 파괴되지 않으며, 이는 웹 컨테이너에서 실행되는 PHP 메커니즘과는 완전히 다릅니다. Workerman에서는 프로세스 생애 주기 내의 정적 멤버 또는 전역 변수가主动 파괴되지 않는 한 영구적으로 유지됩니다. 즉, 객체나 연결 등의 리소스를 전역 변수나 클래스 정적 멤버에 두면 현재 프로세스의 전체 생애 주기 내의 모든 요청이 재사용될 수 있습니다. 예를 들어 단일 프로세스 내에서 데이터베이스 연결을 한 번 초기화하면, 이후 이 프로세스의 모든 요청이 이 데이터베이스 연결을 재사용할 수 있어야 하며, 빈번한 데이터베이스 연결 과정에서 TCP 3-way handshake, 데이터베이스 권한 검증, 연결 종료 시 TCP 4-way handshake 과정을 피할 수 있어 애플리케이션 효율성이 크게 향상됩니다.

11. 고성능

PHP 파일이 디스크에서 읽혀 한 번 분석한 후 메모리에 상주하므로, 다음 사용 시 메모리 내의 opcode를 직접 사용하여 디스크 IO 및 PHP 내 요청 초기화, 실행 환경 생성, 구문 분석, 구문 해석, opcode 컴파일, 요청 종료 등 여러 소요 시간 과정이 크게 줄어듭니다. 또한 nginx, apache와 같은 컨테이너에 의존하지 않으므로 nginx와 같은 컨테이너와 PHP 간 통신의 오버헤드를 줄일 수 있습니다. 가장 중요한 것은 리소스가 영구적으로 유지되므로 매번 데이터베이스 연결 등을 초기화할 필요가 없기에, Workerman으로 애플리케이션을 개발하면 성능이 매우 높습니다.

12. HHVM 지원

HHVM 가상 머신에서 실행을 지원하며 PHP 성능을 몇 배 향상시킬 수 있습니다. 특히 CPU 집약적인 비즈니스에서 성능이 매우 우수합니다. 실제 압력 테스트 비교에서, 부하 비즈니스가 없는 경우 Workerman이 HHVM에서 실행 시 Zend PHP5.6에서 실행할 때 보다 네트워크 처리량이 30-80% 향상된 것을 확인했습니다.

13. 분산 배포 지원

14. 데몬 프로세스 지원

15. 다중 포트 리스닝 지원

16. 표준 입력 출력 리디렉션 지원