*: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 프레임워크를 더 빨리 이해할 수 있도록 여러 프로세스의 분업을 자세히 소개합니다.
디렉토리
Swoole 소개
Swoole 공식 홈페이지
Swoole: PHP 재정의
Swoole: PHP 언어용 고성능 네트워크 통신 프레임워크로, PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 데이터베이스 연결 풀을 제공합니다. , AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리. Swoole은 표준 PHP 확장이지만 실제로는 일반 확장과 다릅니다. 일반 확장은 라이브러리 기능만 제공합니다. Swoole 확장은 실행 후 PHP를 제어하고 이벤트 루프에 들어갑니다. IO 이벤트가 발생하면 swoole은 지정된 PHP 함수를 자동으로 콜백합니다.
기능 데모 코드
<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>
<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 프레임워크 메커니즘의 작동을 보장하는 데 사용됩니다. 여러 기능 스레드를 생성합니다.
Manager 프로세스
Swoole의 Worker/Task 프로세스는 Manager 프로세스에 의해 분기되고 관리됩니다.
마스터 프로세스가 아닌 이유는 마스터 프로세스가 다중 스레드이고 포크 작업을 안전하게 수행할 수 없습니다.
작업자 프로세스
Swoole은 PHP 치명적인 오류, 실수로 다른 프로그램에 의해 종료되거나 max_request 수에 도달한 후 정상적으로 종료되는 등 작업자 프로세스가 비정상적으로 종료되는 경우 완전한 프로세스 관리 메커니즘을 제공합니다. 기본 프로세스는 새 작업자 프로세스를 다시 시작합니다. 코드는 일반 Apache PHP 또는 php-fpm과 같은 Worker 프로세스에서 작성할 수 있습니다. Node.js와 같은 비동기 콜백 코드를 작성할 필요가 없습니다.
작업 프로세스
작업 프로세스의 전체 이름은 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>