Swoole 엔진의 원리 공유에 대한 빠른 소개

coldplay.xixi
풀어 주다: 2021-03-12 11:01:38
앞으로
2001명이 탐색했습니다.

Swoole 엔진의 원리 공유에 대한 빠른 소개

지난 6개월 동안 저는 PHP와 Java 기술 스택을 사용하여 게임 서버 프로젝트를 완료했습니다. 프로젝트에 높은 빈도의 네트워크 요청이 있기 때문에 PHP 기술 스택은 Swoole 엔진(고성능 이벤트 기반 비동기 병렬 네트워크 통신 엔진)을 사용하여 게임 비즈니스의 일부를 완성하려고 했습니다.

추천(무료): swoole

Swoole 설치

Swoole 설치는 중국인이 만든 프로젝트이기 때문에 많은 문제에 대한 답변을 공식 홈페이지 문서에서 확인할 수 있습니다. 설치에는

  • 컴파일과 설치의 두 가지 유형이 있습니다. 공식 릴리스 버전을 다운로드하려면 직접 github 또는 gitee로 이동하세요. 컴파일 및 설치 후 php.ini 파일에 so 확장자를 작성하세요.
  • 컨테이너 설치. 스울 엔진이 널리 사용되므로 허브에 사용 가능한 컨테이너가 많이 있습니다. 필요한 것을 선택하고 당기기만 하면 됩니다.

구체적인 지침을 보려면 Baidu를 클릭하세요. 온라인에는 관련 콘텐츠가 많이 있습니다.

Swoole 엔진의 장점

  1. 레지던트 메모리. 기존 PHP 프레임워크나 단일 파일에서는 각 요청을 처리하기 전에 프레임워크 파일을 로드하고 구성하는 작업을 수행해야 합니다. 요청이 완료된 후에는 모든 리소스와 메모리가 해제되므로 메모리 누수에 대해 걱정할 필요가 없습니다. . 그러나 요청 수가 많아지고 동시성이 높아지면 리소스가 빠르게 생성되고 즉시 해제되므로 PHP 프로그램의 운영 효율성이 급격히 떨어지게 됩니다. Swoole을 사용하면 이 문제가 발생하지 않습니다. PHP 코드가 메모리에 로드된 후 수명 주기가 길어지므로 이러한 방식으로 설정된 데이터베이스 연결 및 기타 대형 개체가 해제되지 않습니다. 각 요청은 소량의 코드만 처리하면 되며, 이 코드는 PHP 파서에 의해서만 컴파일되며 처음 실행될 때 메모리에 상주합니다. 앞으로는 Zend 엔진을 직접 실행할 수 있도록 OPCODE가 직접 로드될 예정입니다. 또한 데이터베이스 연결 풀, 캐시 연결 풀 등 PHP가 이전에 구현할 수 없었던 것들을 Swoole 엔진에서 구현할 수 있습니다. 시스템의 운영 효율성이 크게 향상됩니다.
  2. 빠른 개발. Swoole 엔진은 PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 비동기 Redis, 데이터베이스 연결 풀, AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리를 제공합니다. Swoole에는 Http/WebSocket 서버/클라이언트 및 Http2.0 서버가 내장되어 있습니다.
  3. 코루틴 프로그래밍 모델. Swoole4는 완전 동기 코드를 사용하여 비동기 프로그램을 구현할 수 있습니다. PHP 코드에 추가 키워드를 추가할 필요가 없습니다. 하단 레이어는 비동기 IO를 구현하기 위해 자동으로 코루틴 스케줄링을 수행합니다.

Swoole 엔진 프로세스 분석

Swoole 작업의 흐름도는 다음과 같습니다.

Swoole 엔진의 원리 공유에 대한 빠른 소개

Swoole의 스레드 또는 프로세스

구조도는 다음과 같습니다.

Swoole 엔진의 원리 공유에 대한 빠른 소개

스울 엔진은 단일 스레드 모드와 프로세스 모드의 두 가지 모드로 나뉩니다. 이 문서에서는 프로세스 모드에 대해서만 설명합니다. 둘 사이의 구체적인 차이점은 공식 문서에 설명되어 있습니다.

마스터 프로세스

는 클라이언트 연결 및 로컬 통신 파이프와 같은 핵심 이벤트를 처리하는 데 사용됩니다. 마스터 프로세스에는 여러 스레드가 있으며 각 스레드는 epol 함수의 인스턴스를 실행합니다. (Worker 프로세스는 Master 프로세스에 의해 Fork되지 않기 때문에 Master 프로세스를 강제 종료한 후에도 Worker 프로세스가 계속 존재할 수 있습니다.)

Reactor 스레드

Swoole의 주요 프로세스는 멀티 스레드 프로그램입니다. Reactor 스레드라고 하는 매우 중요한 스레드 그룹이 있습니다. 실제로 TCP 연결을 처리하고 데이터를 주고받는 스레드입니다.
새로운 연결을 수락한 후 Swoole의 메인 스레드는 고정된 Reactor 스레드에 연결을 할당하고 이 스레드는 소켓 모니터링을 담당합니다. 소켓을 읽을 수 있을 때 데이터를 읽고, 프로토콜 분석을 수행하고, 요청을 작업자 프로세스에 전달합니다. 소켓이 쓰기 가능해지면 데이터가 TCP 클라이언트

Manager 프로세스

로 전송됩니다. Swoole의 작업자/작업 프로세스는 모두 Manager 프로세스에 의해 포크되고 관리됩니다.
자식 프로세스가 종료되면 관리자 프로세스는 좀비 프로세스가 되지 않도록 자식 프로세스를 재활용하는 역할을 담당합니다. 그리고 새로운 하위 프로세스를 생성합니다.
서버가 종료되면 관리자 프로세스는 모든 하위 프로세스에 신호를 보내 하위 프로세스에 서비스를 닫도록 알립니다.
서버가 다시 로드되면 관리자 프로세스는 하위 프로세스 하나를 닫거나 다시 시작합니다. 하나의

Worker 프로세스

Swoole은 PHP 치명적인 오류, 실수로 다른 프로그램에 의해 종료되거나 max_request 수에 도달한 후 정상적으로 종료되는 등 Worker 프로세스가 비정상적으로 종료되는 경우 완벽한 프로세스 관리 메커니즘을 제공합니다. 기본 프로세스는 새 작업자 프로세스를 다시 시작합니다. 코드는 일반 apache+php 또는 php-fpm과 같은 Worker 프로세스에서 작성할 수 있습니다. Node.js와 같은 비동기 콜백 코드를 작성할 필요가 없습니다.

각 프로세스의 콜백 함수

Master의 콜백 함수:

  • onStart
  • onShutdown

Worker 프로세스의 콜백 함수

  • onWorkerStart
  • onWorkerStop
  • onConnect
  • onClose
  • onReceive
  • onFinish

TaskWorker 프로세스 내의 콜백 기능

  • onTask
  • onWorkerStart

Manager 프로세스의 콜백 기능

  • onManagerStart
  • onManagerStop

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 인터페이스를 통해 통신할 수 있습니다.

실제 프로젝트에서 각 프로세스 스레드의 업무 분담:

  • Manager 프로세스: 작업자 프로세스 관리, 생성 또는 재활용을 담당
  • Worker 프로세스: 게임 로직 처리
  • taskWorker 프로세스: 네트워크 패킷을 클라이언트, 장기 비활성 TCP 연결 종료

Swoole 버전 호환성

프로젝트 개발 단계에서 사용된 Swoole 엔진 버전은 1.9.6이후 테스트 환경이 4.3.2 버전으로 설치되었기 때문에, 사업코드를 조정해 보았습니다. 그러나 swoole의 이전 버전과의 호환성은 매우 훌륭합니다. 이 과정에서 단 하나의 코드 비호환 문제가 발견되었습니다. 원래 버전에서는 악마 번호를 사용하여 구성되었지만 새 버전에서는 이입니다. 번호는 매크로 정의가 아니었는데 나중에 스울 소스코드를 보다가 매크로 정의 그룹을 찾아서 이 구성을 수정했습니다. (단, 성공적인 버전 업그레이드 역시 상대적으로 적은 수의 Swoole 기반 비즈니스 코드를 기반으로 하기 때문에 참고용일 뿐입니다

관련 학습 추천 더보기 : swoole tutorial

위 내용은 Swoole 엔진의 원리 공유에 대한 빠른 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿