>백엔드 개발 >PHP 튜토리얼 >[PHP]swoole_server의 여러 프로세스 간 작업 분담

[PHP]swoole_server의 여러 프로세스 간 작업 분담

WBOY
WBOY원래의
2016-07-30 13:30:27899검색

*:first-child{margin-top: 0 !important}.markdown-body>*:last-child{margin-bottom: 0 !important}.markdown-body .absent{color: #c00}.markdown-body .anchor{위치: 절대;상단: 0;왼쪽: 0;디스플레이: 블록;패딩-오른쪽: 6px;패딩-왼쪽: 30px; margin-left: -30px}.markdown-body .anchor:focus{개요: 없음}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5, .markdown-body h6{위치: 상대;여백 상단: 1em;여백 하단: 16px;글꼴-가중치: 굵게;줄 높이: 1.4}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link{표시: 없음;색상: #000;수직 정렬: 중간}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3 :hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{padding-left: 8px;margin-left: -30px;text- 장식: 없음}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{display: inline-block}.markdown-body h1 tt ,.markdown-body h1 코드,.markdown-body h2 tt,.markdown-body h2 코드,.markdown-body h3 tt,.markdown-body h3 코드,.markdown-body h4 tt,.markdown-body h4 코드, .markdown-body h5 tt,.markdown-body h5 코드,.markdown-body h6 tt,.markdown-body h6 코드{글꼴 크기: 상속}.markdown-body h1{padding-bottom: 0.3em;글꼴 크기 : 2.25em;line-height: 1.2;border-bottom: 1px solid #eee}.markdown-body h1 .anchor{line-height: 1}.markdown-body h2{padding-bottom: 0.3em;font-size: 1.75em;라인 높이: 1.225;테두리 바닥: 1px 솔리드 #eee}.markdown-body h2 .anchor{라인 높이: 1}.markdown-body h3{글꼴 크기: 1.5em;라인 높이: 1.43 }.markdown-body h3 .anchor{라인 높이: 1.2}.markdown-body h4{글꼴 크기: 1.25em}.markdown-body h4 .anchor{라인 높이: 1.2}.markdown-body h5{글꼴- 크기: 1em}.markdown-body h5 .anchor{라인 높이: 1.1}.markdown-body h6{글꼴 크기: 1em;색상: #777}.markdown-body h6 .anchor{라인 높이: 1.1}. markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top: 0;margin-bottom : 16px}.markdown-body hr{높이: 4px;padding: 0;margin: 16px 0; background-color: #e7e7e7;border: 0 없음}.markdown-body ul,.markdown-body ol{padding-left: 2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding: 0;list-style-type: none}.markdown-body ul ul,.markdown-body ul ol,.markdown -body ol ol,.markdown-body ol ul{margin-top: 0;margin-bottom: 0}.markdown-body li>p{margin-top: 16px}.markdown-body dl{padding: 0}.markdown -body dl dt{패딩: 0;margin-top: 16px;font-size: 1em;font-style: italic;font-weight:bold}.markdown-body dl dd{padding: 0 16px;margin-bottom: 16px }.markdown-body blockquote{padding: 0 15px;color: #777;border-left: 4px solid #ddd}.markdown-body blockquote>:first-child{margin-top: 0}.markdown-body blockquote>: last-child{margin-bottom: 0}.markdown-body 테이블{display: block;width: 100%;overflow: auto;word-break: Normal;word-break: keep-all}.markdown-body 테이블 th{ 글꼴 무게: 굵게}.markdown-body 테이블 th,.markdown-body 테이블 td{패딩: 6px 13px;border: 1px 솔리드 #ddd}.markdown-body 테이블 tr{배경-색상: #fff;border-top: 1px 솔리드 #ccc}.markdown-body 테이블 tr:nth-child(2n){배경-색상: #f8f8f8}.markdown-body img{max-width: 100%;box-sizing: border-box}.markdown- 본문 스팬.프레임{디스플레이: 블록;오버플로: 숨겨진}.markdown-body 스팬.프레임>스팬{디스플레이: 블록;플로트: 왼쪽;너비: 자동;패딩: 7px;마진: 13px 0 0;오버플로: 숨겨진;테두리 : 1px solid #ddd}.markdown-bodyspan.framespanimg{display: block;float:left}.markdown-bodyspan.framespanspan{display:block;padding: 5px 0 0;clear:both;color: #333}.markdown-body span.align-center{display: block;overflow: Hidden;clear: 둘 다}.markdown-bodyspan.align-center>span{display: block;margin: 13px auto 0;overflow: hide ;text-align: center}.markdown-bodyspan.align-centerspanimg{margin: 0 auto;text-align:center}.markdown-bodyspan.align-right{display: block;overflow:hidden;clear: 둘 다}.markdown-bodyspan.align-right>span{display: block;margin: 13px 0 0;overflow: Hidden;text-align: right}.markdown-bodyspan.align-rightspanimg{margin: 0; 텍스트 정렬: 오른쪽}.markdown-bodyspan.float-left{display: block;float: left;margin-right: 13px;overflow: Hidden}.markdown-bodyspan.float-leftspan{margin: 13px 0 0 }.markdown-bodyspan.float-right{display: block;float: right;margin-left: 13px;overflow: Hidden}.markdown-bodyspan.float-right>span{display: block;margin: 13px auto 0 ;overflow: Hidden;text-align: right}.markdown-body code,.markdown-body tt{padding: 0;padding-top: 0.2em;padding-bottom: 0.2em;margin: 0;font-size: 85 %;배경색: rgba(0,0,0,0.04);border-radius: 3px}.markdown-body code:before,.markdown-body code:after,.markdown-body tt:before,.markdown- body tt:after{letter-spacing: -0.2em;content: " 0a0"}.markdown-body code br,.markdown-body tt br{display: none}.markdown-body del code{text-꾸밈: 상속} .markdown-body pre>code{padding: 0;margin: 0;font-size: 100%;word-break: Normal;white-space: pre;Background: transparent;border: 0}.markdown-body .highlight{ 여백 하단: 16px}.markdown-body .highlight pre,.markdown-body pre{padding: 16px;overflow: auto;font-size: 85%;line-height: 1.45; background-color: #f7f7f7;border-radius: 3px}.markdown -body .highlight pre{margin-bottom: 0;word-break: Normal}.markdown-body pre{word-wrap: Normal}.markdown-body pre code,.markdown-body pre tt{display: inline;max- 너비: 초기;패딩: 0;여백: 0;오버플로: 초기;줄 높이: 상속;단어 포장: 일반;배경 색상: 투명;경계: 0}.markdown-body 사전 코드:이전,.markdown- 본문 사전 코드:after,.markdown-body pre tt:before,.markdown-body pre tt:after{content: Normal}.markdown-body kbd{display: inline-block;padding: 3px 5px;font-size: 11px ;라인 높이: 10px;색상: #555;세로 정렬: 중간;배경 색상: #fcfcfc;테두리: 단색 1px #ccc;테두리 하단-색상: #bbb;테두리 반경: 3px;상자 그림자 : 삽입 0 -1px 0 #bbb}.codehilite{배경: #ffffff}.codehilite .c{색상: #999988;글꼴 스타일: 기울임꼴}.codehilite .err{색상: #a61717;배경 색상: #e3d2d2} .codehilite .k{색상: #000000;글꼴 가중치: 굵게}.codehilite .o{색상: #000000;글꼴 가중치: 굵게}.codehilite .cm{색상: #999988;글꼴 스타일: 기울임꼴}.codehilite .cp{색상: #999999;글꼴 두께: 굵게}.codehilite .c1{색상: #999988;글꼴 스타일: 기울임꼴}.codehilite .cs{색상: #999999;글꼴 두께: 굵게;글꼴 스타일: 기울임꼴}.codehilite .gd{색상: #000000;배경색: #ffdddd}.codehilite .gd .x{색상: #000000;배경색: #ffaaaa}.codehilite .ge{색상: #000000;글꼴- 스타일: 기울임꼴}.codehilite .gr{색상: #aa0000}.codehilite .gh{색상: #999999}.codehilite .gi{색상: #000000;배경색: #ddffdd}.codehilite .gi .x{색상: #000000;배경색: #aaffaa}.codehilite .go{색상: #888888}.codehilite .gp{색상: #555555}.codehilite .gs{글꼴-가중치: 굵게}.codehilite .gu{색상: #aaaaaa }.codehilite .gt{색상: #aa0000}.codehilite .kc{색상: #000000;글꼴 가중치: 굵게}.codehilite .kd{색상: #000000;글꼴 가중치: 굵게}.codehilite .kp{색상: #000000;글꼴-가중치: 굵게}.codehilite .kr{색상: #000000;글꼴-가중치: 굵게}.codehilite .kt{색상: #445588;글꼴-가중치: 굵게}.codehilite .m{색상: #009999 }.codehilite .s{색상: #d14}.codehilite .na{색상: #008080}.codehilite .nb{색상: #0086B3}.codehilite .nc{색상: #445588;글꼴 가중치: 굵게}.codehilite . 아니요{색상: #008080}.codehilite .ni{색상: #800080}.codehilite .ne{색상: #990000;글꼴-가중치: 굵게}.codehilite .nf{색상: #990000;글꼴-가중치: 굵게}. codehilite .nn{색상: #555555}.codehilite .nt{색상: #000080}.codehilite .nv{색상: #008080}.codehilite .ow{색상: #000000;글꼴 가중치: 굵게}.codehilite .w{ 색상: #bbbbbb}.codehilite .mf{색상: #009999}.codehilite .mh{색상: #009999}.codehilite .mi{색상: #009999}.codehilite .mo{색상: #009999}.codehilite .sb{ 색상: #d14}.codehilite .sc{색상: #d14}.codehilite .sd{색상: #d14}.codehilite .s2{색상: #d14}.codehilite .se{색상: #d14}.codehilite .sh{ 색상: #d14}.codehilite .si{색상: #d14}.codehilite .sx{색상: #d14}.codehilite .sr{색상: #009926}.codehilite .s1{색상: #d14}.codehilite .ss{ 색상: #990073}.codehilite .bp{색상: #999999}.codehilite .vc{색상: #008080}.codehilite .vg{색상: #008080}.codehilite .vi{색상: #008080}.codehilite .il{ 색상: #009999}

[PHP]swoole_server进程的分工


요약: Swoole은 PHP 언어의 고성능 네트워크 통신 프레임워크로, PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 데이터베이스 연결 풀, AsyncTask, 메시지 큐를 제공합니다. , 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리. 강력한 기능은 명확한 분업을 통해 여러 프로세스에 의해 구현됩니다. 여기에서는 초보자가 Swoole 프레임워크를 더 빨리 이해할 수 있도록 여러 프로세스의 분업을 자세히 소개합니다.


  • 블로그: http://www.cnblogs.com/jhzhu
  • 이메일: jhzhuustc@gmail.com
  • 저자: Zhimingso
  • 시간: 2015-08-17

디렉토리

  • [PHP]swoole_server 프로세스의 분업
    • 디렉토리
    • Swoole 소개
      • Swoole: PHP 재정의
      • 기능 데모 코드 조각
        • TCP 서버
        • TCP 클라이언트
    • 주요 프로세스 분석
      • 마스터 프로세스
      • 관리자 프로세스
      • 작업자 프로세스
      • 업무 프로세스
    • 프로세스와 이벤트 콜백의 대응
      • 마스터 프로세스의 콜백 함수
      • 워커 프로세스의 콜백 함수
      • 태스크 프로세스의 콜백 함수
      • Manager 프로세스의 콜백 기능

Swoole 소개

Swoole 공식 홈페이지

Swoole: PHP 재정의

Swoole: PHP 언어용 고성능 네트워크 통신 프레임워크로, PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 데이터베이스 연결 풀을 제공합니다. , AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리. Swoole은 표준 PHP 확장이지만 실제로는 일반 확장과 다릅니다. 일반 확장은 라이브러리 기능만 제공합니다. Swoole 확장은 실행 후 PHP를 제어하고 이벤트 루프에 들어갑니다. IO 이벤트가 발생하면 swoole은 지정된 PHP 함수를 자동으로 콜백합니다.

기능 데모 코드

TCP 서버

<span>$serv = new swoole_server("127.0.0.1", 9501);</span><span>$serv->set(array(</span><span>    'worker_num' => 8,   //工作进程数量</span><span>    'daemonize' => true, //是否作为守护进程</span><span>));</span><span>$serv->on('connect', function ($serv, $fd){</span><span>    echo "Client:Connect.\n";</span><span>});</span><span>$serv->on('receive', function ($serv, $fd, $from_id, $data) {</span><span>    $serv->send($fd, 'Swoole: '.$data);</span><span>    $serv->close($fd);</span><span>});</span><span>$serv->on('close', function ($serv, $fd) {</span><span>    echo "Client: Close.\n";</span><span>});</span><span>$serv->start();</span>

TCP 클라이언트

<span>$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);</span><span>//设置事件回调函数</span><span>$client->on("connect", function($cli) {</span><span>    $cli->send("hello world\n");</span><span>});</span><span>$client->on("receive", function($cli, $data){</span><span>    echo "Received: ".$data."\n";</span><span>});</span><span>$client->on("error", function($cli){</span><span>    echo "Connect failed\n";</span><span>});</span><span>$client->on("close", function($cli){</span><span>    echo "Connection close\n";</span><span>});</span><span>//发起网络连接</span><span>$client->connect('127.0.0.1', 9501, 0.5);</span>

더 많은 코드 조각을 보려면 swoole의 공식 웹사이트를 참조하세요.

주요 프로세스 분석

마스터 프로세스

마스터 프로세스는 주로 Swoole 프레임워크 메커니즘의 작동을 보장하는 데 사용됩니다. 여러 기능 스레드를 생성합니다.

  • 리액터 스레드: 실제로 TCP 연결을 처리하고 데이터를 보내고 받는 스레드입니다. 새로운 연결을 수락한 후 swoole의 메인 스레드는 고정된 Reactor 스레드에 연결을 할당하고 이 스레드는 소켓 모니터링을 담당합니다. 소켓을 읽을 수 있을 때 데이터를 읽고, 프로토콜 분석을 수행하고, 요청을 작업자 프로세스에 전달합니다. 소켓에 쓰기가 가능해지면 TCP 클라이언트에 데이터를 보냅니다.
  • 마스터 스레드(메인 스레드): 새로운 연결 수락, UNIX PROXI 신호 처리, 타이머 작업을 담당합니다.
  • 하트비트 패킷 감지 스레드: (생략)
  • UDP 패킷 수신 스레드: (생략)

Manager 프로세스

Swoole의 Worker/Task 프로세스는 Manager 프로세스에 의해 분기되고 관리됩니다.

  • 자식 프로세스가 종료되면 관리자 프로세스는 좀비 프로세스가 되지 않도록 자식 프로세스를 재활용하는 역할을 담당합니다. 그리고 새로운 하위 프로세스를 생성합니다
  • 서버가 종료되면 관리자 프로세스는 모든 하위 프로세스에 신호를 보내 하위 프로세스에 서비스 종료를 알립니다
  • 서버가 다시 로드되면 관리자 프로세스가 하위 프로세스를 하나씩 종료/다시 시작합니다.

마스터 프로세스가 아닌 이유는 마스터 프로세스가 다중 스레드이고 포크 작업을 안전하게 수행할 수 없습니다.

작업자 프로세스

  • 는 Reactor 스레드에서 전달한 요청 패킷을 수락하고 PHP 콜백 함수를 실행하여 데이터를 처리합니다.
  • 응답 데이터를 생성하여 보냅니다. Reactor 스레드에 의해 TCP 클라이언트로 전송된 Reactor 스레드
  • 비동기식 비차단 모드 또는 동기식 차단 모드일 수 있습니다.
  • 작업자는 다중 프로세스 모드에서 실행됩니다

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

작업 프로세스

  • 는 swoole_server->task/taskwait 메서드를 통해 Worker 프로세스에서 전달한 작업을 수락합니다.
  • 작업을 처리하고 결과를 반환합니다. data 작업자 프로세스의 경우
  • 완전한 동기식 차단 모드입니다
  • 작업이 다중 프로세스 방식으로 실행됩니다

작업 프로세스의 전체 이름은 task_worker 프로세스입니다. , 이는 특별한 종류의 작업자 프로세스입니다. 따라서 작업 프로세스에서도 onWorkerStart이 호출됩니다. $worker_id >= $serv->setting['worker_num']이면 이 프로세스가 task_worker라는 의미이고, 그렇지 않으면 이 프로세스가 작업자 프로세스라는 의미입니다.

프로세스와 이벤트 콜백의 대응

Master 프로세스의 콜백 함수

<span>onStart</span><span>onShutdown</span><span>onMasterConnect</span><span>onMasterClose</span><span>onTimer</span>

Worker 프로세스의 콜백 함수

<span>onWorkerStart</span><span>onWorkerStop</span><span>onConnect</span><span>onClose</span><span>onReceive</span><span>onTimer</span><span>onFinish</span>

Task 프로세스의 콜백 기능

<span>onTask</span><span>onWorkerStart</span>

Manager 프로세스의 콜백 기능

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