>백엔드 개발 >PHP 튜토리얼 >Swoole의 건축 분석

Swoole의 건축 분석

不言
不言원래의
2018-08-06 10:13:382844검색

이 글의 내용은 스울레의 건축학적 분석에 대한 내용입니다. 도움이 필요한 친구들이 참고하시면 좋겠습니다.

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

swoole은 주로 Master 프로세스(메인 프로세스)와 Manager 프로세스에서 기능을 완성하는 데 사용됩니다.

마스터 프로세스

는 다중 스레드 프로그램입니다. Reactor 스레드라고 하는 매우 중요한 스레드 그룹이 있습니다. 실제로 TCP 연결을 처리하고 데이터를 주고받는 스레드입니다.

Manager 프로세스

작업자/작업 프로세스를 관리합니다. 작업자/작업 프로세스는 모두 Manager 프로세스에 의해 분기되고 관리됩니다.

Reactor 스레드

새 연결을 수락한 후 메인 스레드(마스터 프로세스)는 고정된 Reactor 스레드에 연결을 할당하고 이 스레드는 소켓 모니터링을 담당합니다. 소켓을 읽을 수 있을 때 데이터를 읽고, 프로토콜 분석을 수행하고, 요청을 작업자 프로세스에 전달합니다.

  • 클라이언트 TCP 연결 유지, 네트워크 IO 처리, 프로토콜 처리, 데이터 전송 및 수신을 담당합니다TCP连接、处理网络IO、处理协议、收发数据

  • 完全是异步非阻塞的模式

  • 全部为C代码,除Start/Shudown事件回调外,不执行任何PHP代码

  • TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包

  • Reactor以多线程的方式运行

Work进程

类似与php-fpm进程。

  • 接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据

  • 生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端

  • 可以是异步模式,也可以是同步模式

  • Worker以多进程的方式运行

TaskWorker进程

异步处理其他任务的进程,使用方方式类似与Gearman。

  • 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务

  • 处理任务,并将结果数据返回(swoole_server->finish)给Worker进程

  • TaskWorker以多进程的方式运行

关系

可以理解为Reactor就是nginxWorker就是php-fpmReactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理(在回调函数中处理)。ReactorWorker间通过UnixSocket

는 완전히 비동기 비차단 모드입니다.

모두 C 코드입니다. Start/Shudown 이벤트 콜백을 제외하면 PHP 코드가 실행되지 않습니다.

Replace TCP클라이언트가 보낸 데이터는 버퍼링되고, 연결되고, 완전한 요청 패킷으로 분할됩니다

Reactor는 멀티 스레드 방식으로 실행됩니다

작업 프로세스

    php-fpm 프로세스와 유사합니다.
  1. Reactor 스레드에서 전달한 요청 패킷을 수락하고 PHP 콜백 함수를 실행하여 데이터를 처리합니다.
  2. 응답 데이터를 생성하여 Reactor code>Reactor 스레드에서 TCP 클라이언트
  3. 로 전송되는 스레드는 비동기 모드 또는 동기 모드
  4. 일 수 있습니다. Worker다중 프로세스로 실행
  5. TaskWorker 프로세스
  6. 다른 작업을 비동기적으로 처리하는 프로세스입니다. 사용 방법은 Gearman과 유사합니다.

  7. swoole_server->task/taskwait 메서드를 통해 Worker 프로세스에서 전달한 작업을 수락합니다.

작업을 처리하고 결과 데이터를 반환합니다( swoole_server->finish)는 Worker 프로세스

TaskWorker가 다중 프로세스 모드
  1. 에서 실행되도록 합니다. 관계

  2. 는 이해할 수 있습니다. Reactor의 경우 nginx이고, Worker의 경우 php-fpm입니다. Reactor 스레드는 네트워크 요청을 비동기식 및 병렬로 처리한 다음 처리를 위해 Worker 프로세스로 전달합니다(콜백 함수에서 처리됨). ReactorWorkerUnixSocket을 통해 통신합니다.
  3. 이벤트 처리 프로세스
  4. 🎜Swoole 이벤트 처리 프로세스를 이해하려면 먼저 두 가지 네트워크 이벤트 처리 모드를 이해하세요. 🎜🎜리액터 모드🎜🎜메인 스레드(I/O 처리 장치)가 파일 디스크립터에서 이벤트가 발생하는지 여부만 모니터링하고, 발생하는 경우 즉시 작업자 스레드/프로세스(논리 장치)에 이벤트를 알리는 것이 필요합니다. 그 외에 메인 스레드는 다른 작업을 수행하지 않습니다. 데이터 읽기 및 쓰기, 새 연결 수락, 고객 요청 처리는 모두 작업자 스레드에서 수행됩니다. 🎜🎜Proactor 모드🎜🎜두 가지 구현🎜🎜Proactor 모드를 구현하려면 I/O 비동기 모델을 사용하세요. 원리: 모든 I/O 작업은 커널과 협력하여 이를 처리하는 메인 스레드로 넘겨지고, 비즈니스 논리 작업은 논리 유닛으로 넘겨집니다. 예를 들어, 이를 달성하려면 aio_read를 사용하세요. 🎜🎜워크플로: 🎜🎜🎜🎜메인 스레드는 aio_read 함수를 호출하여 소켓의 읽기 완료 이벤트를 커널에 등록합니다. 🎜🎜🎜🎜메인 스레드는 계속해서 다른 I/O 이벤트를 처리합니다. 🎜🎜🎜🎜소켓의 데이터를 사용자 버퍼로 읽어오면 커널은 애플리케이션(논리 장치)에 신호를 보내 애플리케이션에 데이터를 사용할 수 있음을 알립니다. 🎜🎜🎜🎜애플리케이션은 데이터(클라이언트 요청)를 읽고, 처리 후 aio_write 함수를 호출하여 소켓의 쓰기 이벤트를 커널에 등록합니다. 🎜🎜🎜🎜메인 스레드는 계속해서 다른 로직을 처리합니다. 🎜🎜🎜🎜사용자 버퍼의 데이터가 소켓에 기록되면 커널은 애플리케이션에 신호를 보내 데이터가 전송되었음을 애플리케이션에 알립니다. 🎜🎜🎜🎜애플리케이션에는 소켓 닫기 등의 여파를 처리하기 위해 사전 정의된 신호 처리 기능이 있습니다.🎜🎜🎜🎜I/O 동기화 모델을 사용하여 Proactor 모드를 구현합니다. 원리: 메인 스레드는 I/O 이벤트 데이터의 읽기 및 쓰기 작업을 수행하고 비즈니스 논리 작업은 논리 장치로 전달됩니다. 예를 들어 epoll을 사용하면 이를 달성할 수 있습니다. 🎜🎜워크플로: 🎜🎜🎜🎜메인 스레드는 epoll 커널 이벤트 테이블의 소켓에 대한 읽기 준비 이벤트를 등록합니다. 🎜🎜🎜🎜메인 스레드는 epoll_wait를 호출하여 소켓에서 데이터를 읽을 때까지 기다립니다. 🎜🎜🎜🎜epoll_wait가 반환된 후 메인 스레드는 소켓에서 데이터를 읽은 다음 읽은 데이터를 요청 개체(클라이언트의 요청)로 캡슐화하여 요청 대기열에 삽입합니다. 🎜
  5. 따라서 대기열의 소비자 스레드는 요청 개체를 처리한 다음 epoll 커널 이벤트 테이블의 소켓에 쓰기 준비 이벤트를 등록합니다.

  6. 메인 스레드는 epoll_wait를 호출하여 소켓이 쓰기 가능해질 때까지 기다립니다.

  7. 소켓이 쓰기 가능해지면 epoll_wait가 메인 스레드에 이를 알립니다. 메인 스레드는 요청 결과를 소켓에 씁니다.

swoole 이벤트 아키텍처 다이어그램

사진에서 볼 수 있듯이, put Reactor 스레드와 작업 프로세스가 결합되어 작업자 스레드로 표시되면 swoole은 리액터 이벤트 처리 모드를 사용합니다.

요청이 진행되는 단계는 다음과 같습니다.

1 서버 메인 스레드는 클라이언트의 연결을 기다립니다.

2. Reactor 스레드는 연결된 소켓을 처리하고, 소켓에서 요청 데이터를 읽고(수신), 요청을 캡슐화하여 작업 프로세스에 전달합니다.

3. 작업 프로세스는 비즈니스 데이터를 처리하는 논리적 단위입니다.

4. 작업 프로세스 결과가 Reactor 스레드로 반환됩니다.

5. Reactor 스레드는 결과를 다시 소켓에 씁니다(보내기).

각 모듈의 작업에 대한 위의 구조 소개를 검토하세요.

관련 권장 사항:

모델을 맞춤설정하는 방법은 무엇인가요? ThinkPHP3.2 사용자 정의 기본 클래스 모델 사용

PHP를 사용하여 Excel 파일 내용을 읽고 셀 데이터를 얻는 방법
#🎜🎜 #

위 내용은 Swoole의 건축 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.