지난 6개월 동안 저는 PHP와 Java 기술 스택을 사용하여 게임 서버 프로젝트를 완료했습니다. 프로젝트에 높은 빈도의 네트워크 요청이 있기 때문에 PHP 기술 스택은 Swoole 엔진(고성능 이벤트 기반 비동기 병렬 네트워크 통신 엔진)을 사용하여 게임 비즈니스의 일부를 완성하려고 했습니다.
추천(무료): swoole
Swoole 설치
Swoole 설치는 중국인이 만든 프로젝트이기 때문에 많은 문제에 대한 답변을 공식 홈페이지 문서에서 확인할 수 있습니다. 설치에는
구체적인 지침을 보려면 Baidu를 클릭하세요. 온라인에는 관련 콘텐츠가 많이 있습니다.
Swoole 엔진의 장점
Swoole 엔진 프로세스 분석
Swoole 작업의 흐름도는 다음과 같습니다.
Swoole의 스레드 또는 프로세스
구조도는 다음과 같습니다.
스울 엔진은 단일 스레드 모드와 프로세스 모드의 두 가지 모드로 나뉩니다. 이 문서에서는 프로세스 모드에 대해서만 설명합니다. 둘 사이의 구체적인 차이점은 공식 문서에 설명되어 있습니다.
는 클라이언트 연결 및 로컬 통신 파이프와 같은 핵심 이벤트를 처리하는 데 사용됩니다. 마스터 프로세스에는 여러 스레드가 있으며 각 스레드는 epol 함수의 인스턴스를 실행합니다. (Worker 프로세스는 Master 프로세스에 의해 Fork되지 않기 때문에 Master 프로세스를 강제 종료한 후에도 Worker 프로세스가 계속 존재할 수 있습니다.)
Swoole의 주요 프로세스는 멀티 스레드 프로그램입니다. Reactor 스레드라고 하는 매우 중요한 스레드 그룹이 있습니다. 실제로 TCP 연결을 처리하고 데이터를 주고받는 스레드입니다.
새로운 연결을 수락한 후 Swoole의 메인 스레드는 고정된 Reactor 스레드에 연결을 할당하고 이 스레드는 소켓 모니터링을 담당합니다. 소켓을 읽을 수 있을 때 데이터를 읽고, 프로토콜 분석을 수행하고, 요청을 작업자 프로세스에 전달합니다. 소켓이 쓰기 가능해지면 데이터가 TCP 클라이언트
로 전송됩니다. Swoole의 작업자/작업 프로세스는 모두 Manager 프로세스에 의해 포크되고 관리됩니다.
자식 프로세스가 종료되면 관리자 프로세스는 좀비 프로세스가 되지 않도록 자식 프로세스를 재활용하는 역할을 담당합니다. 그리고 새로운 하위 프로세스를 생성합니다.
서버가 종료되면 관리자 프로세스는 모든 하위 프로세스에 신호를 보내 하위 프로세스에 서비스를 닫도록 알립니다.
서버가 다시 로드되면 관리자 프로세스는 하위 프로세스 하나를 닫거나 다시 시작합니다. 하나의
Swoole은 PHP 치명적인 오류, 실수로 다른 프로그램에 의해 종료되거나 max_request 수에 도달한 후 정상적으로 종료되는 등 Worker 프로세스가 비정상적으로 종료되는 경우 완벽한 프로세스 관리 메커니즘을 제공합니다. 기본 프로세스는 새 작업자 프로세스를 다시 시작합니다. 코드는 일반 apache+php 또는 php-fpm과 같은 Worker 프로세스에서 작성할 수 있습니다. Node.js와 같은 비동기 콜백 코드를 작성할 필요가 없습니다.
각 프로세스의 콜백 함수
Master의 콜백 함수:
Worker 프로세스의 콜백 함수
TaskWorker 프로세스 내의 콜백 기능
Manager 프로세스의 콜백 기능
Reactor, Worker, TaskWorker의 관계
는 Reactor로 이해하면 되는데, 작업자는 PHP입니다 -fpm. Reactor 스레드는 네트워크 요청을 비동기식 및 병렬로 처리한 다음 처리를 위해 작업자 프로세스로 전달합니다. Reactor와 Worker는 UnixSocket을 통해 통신합니다.
php-fpm 애플리케이션에서는 작업이 Redis와 같은 대기열에 비동기적으로 전달되는 경우가 많으며 일부 PHP 프로세스는 이러한 작업을 비동기적으로 처리하기 위해 백그라운드에서 시작됩니다. Swoole에서 제공하는 TaskWorker는 작업 전달, 대기열 및 PHP 작업 처리 프로세스 관리를 통합하는 보다 완벽한 솔루션입니다. 비동기 작업 처리는 기본 레이어에서 제공하는 API를 통해 매우 간단하게 구현할 수 있습니다. 또한 TaskWorker는 작업 실행이 완료된 후 Worker에 결과를 반환할 수도 있습니다.
Swoole의 Reactor, Worker, TaskWorker는 긴밀하게 통합되어 더욱 발전된 사용 방법을 제공할 수 있습니다. 보다 대중적인 비유: Swoole 애플리케이션 서버가 공장이고 Reactor가 고객 주문을 받는 판매용 서버라고 가정합니다. 작업자는 작업자입니다. 영업사원이 주문을 받으면 작업자는 고객이 원하는 것을 생산하기 위해 출근합니다. TaskWorker는 Worker가 업무에 집중할 수 있도록 일부 집안일을 도와줄 수 있는 관리 직원으로 이해될 수 있습니다.
맨 아래 레이어는 Worker 프로세스와 TaskWorker 프로세스에 고유 ID를 할당합니다. 서로 다른 Worker 및 TaskWorker 프로세스는 sendMessage 인터페이스를 통해 통신할 수 있습니다.
실제 프로젝트에서 각 프로세스 스레드의 업무 분담:
Swoole 버전 호환성
프로젝트 개발 단계에서 사용된 Swoole 엔진 버전은 1.9.6이후 테스트 환경이 4.3.2 버전으로 설치되었기 때문에, 사업코드를 조정해 보았습니다. 그러나 swoole의 이전 버전과의 호환성은 매우 훌륭합니다. 이 과정에서 단 하나의 코드 비호환 문제가 발견되었습니다. 원래 버전에서는 악마 번호를 사용하여 구성되었지만 새 버전에서는 이입니다. 번호는 매크로 정의가 아니었는데 나중에 스울 소스코드를 보다가 매크로 정의 그룹을 찾아서 이 구성을 수정했습니다. (단, 성공적인 버전 업그레이드 역시 상대적으로 적은 수의 Swoole 기반 비즈니스 코드를 기반으로 하기 때문에 참고용일 뿐입니다
관련 학습 추천 더보기 : swoole tutorial
위 내용은 Swoole 엔진의 원리 공유에 대한 빠른 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!