swoole 의 역할 과 원 리 를 논 하 다.
나 는 먼저 공식 문서 에서 Swole 의 정 의 를 참조 했다.
Swoole:생산 환경 을 위 한 PHP 비동기 네트워크 통신 엔진.
PHP 개발 자 들 이 고성능,확장 가능 한 비동기 병렬 TCP,UDP,Unix Socket,HTTP,WebSocket 서 비 스 를 작성 할 수 있 도록 합 니 다.비 차단 I/O 프로 그래 밍 과 초급 Linux 커 널 을 깊이 이해 하지 않 아 도 됩 니 다.
Swoole 은 PHP 의 기본 확장 으로 C 언어 로 작 성 됩 니 다.듣 기 에는 그런대로 괜 찮 은 것 같은 데,그 렇 죠?PHP 로 HTTP 서 비 스 를 실행 합 니까?PHP 로 Websockets?또 다른 가능성 이 있 습 니 다.너무 경망 하지 않 습 니까?그리고 이 모든 것 이 높 은 성능 을 유지 할 것 입 니 다.한번 봅 시다!
어떻게 그것 을 운행 시 킵 니까?
플랫폼 마다 설치 방법 에 차이 가 있 습 니 다.
리 눅 스에 대해 말하자면,PECL 명령 하나만 실행 하면 된다.
pecl install swoole
MacOS 사용 자 는 brew 명령 을 사용 할 수 있 습 니 다.
brew install swoole
brew install homebrew/php/php72-swoole
번역자 주:번역 을 마 칠 때 Brew 공식 은 모든 PHP 확장 자 를 제 거 했 습 니 다.PECL 로 설치 하 십시오.
윈도 에 설 치 된 것 은 잠시 지원 되 지 않 지만 Docker 방식 을 사용 할 수 있 습 니 다.
Docker 로 Swoole 실행 하기
PHP+Swoole 을 실행 하 는 가장 좋 은 방안 은 Docker 임 에 틀림없다.스 울 을 포함 한 용 기 를 만 드 는 방법 을 살 펴 보 자.우선,우 리 는 Dockerfile 을 만들어 야 합 니 다.
FROM php:latest\
RUN pecl install swoole\
ADD php.ini /usr/local/etc/php\
RUN usermod -u 1000 www-data
이것 은 매우 직접적 으로 보인다.PHP 공식 Docker 미 러 를 기반 으로 PECL 을 사용 하여 Swole 을 설치 한 다음 pp.ini 를 미 러 에 복사 합 니 다.마지막 줄 은 MacOS 의 Docker 의 일반적인 권한 복구 명령 입 니 다.
복 사 된 php.ini 프로필 은 한 줄 만 필요 합 니 다:
extension=swoole.so
스 울 뭐 할 수 있어 요?
Swoole 은 여러 가지 기능 이 있 는데 대부분 비동기 로 실 행 됩 니 다.다음은 그 중에서 가장 흥미 로 운 부분 입 니 다.(다른 것 은 Swole 공식 문서 에서 찾 을 수 있 습 니 다)
Swoole 기반 HTTP 서비스 구현
Swoole 기반 으로 소량의 코드 만 있 으 면 간단 한 비동기 HTTP 서 비 스 를 실현 할 수 있 습 니 다.다음은 예제 코드 입 니 다.이 예 는 비동기 파일 시스템 을 사용 하여 index.html 파일 을 읽 고 모든 요청 에 응답 합 니 다.
<?php
chdir(__DIR__);
$http = new swoole_http_server('php', 8080);
$http->on('start', function ($server) {
echo "Server has been started!
";
});
$http->on('request', function ($request, $response) {
swoole_async_readfile('index.html', function($filename, $content) use ($response) {
$response->header('Content-Type', 'text/html');
$response->end($content);
});
});
$http->start();
보시 다시 피 이 코드 는 Node.js 스타일 처럼 보 입 니 다.우선,HTTP 서비스 와 유사 한 swoole 을 만 듭 니 다.http_server 대상.이 어 두 개의 비동기 반전 함 수 를 다음 이벤트 로 연결 합 니 다.하 나 는 시작 에 사용 되 며 서비스 가 시 작 될 때 호출 됩 니 다.다른 하 나 는 요청 에 사 용 됩 니 다.요청 을 받 을 때마다 호출 됩 니 다.$request 와$response 두 개의 인 자 를 가지 고 있 습 니 다.
$request 대상 은 요청 과 관련 된 모든 데 이 터 를 포함 합 니 다:요청 경로(Path),헤더 정보(Headers)등.$response 는 출력,응답 헤더 설정 에 사 용 됩 니 다.특히 상기 두 대상 모두 PSR 기준 에 부합 하지 않 고 스 울 이 사용자 정의 했다.
요청 이벤트 에서 비동기 요청 파일 시스템 은 파일 에서 데 이 터 를 불 러 오 는 데 사 용 됩 니 다.데이터 가 사용 가능 하면 데이터 로드 가 완료 되면 리 셋 이 실 행 됩 니 다.그리고 이 데 이 터 를 응답 체 에 불 러 오고 이번 응답 보다 닫 습 니 다.이것 은 데 이 터 를 브 라 우 저 로 효과적으로 보 낼 것 이다.
이렇게 보면 매우 간결 해 보이 고 가장 중요 한 것 은-운행 할 수 있다 는 것 이다.성능 이 어떤 지 볼 까요?
HTTP 서버 표준
Swoole 을 사용 하여 HTTP 서버 의 성능 을 테스트 하기 위해 Node 에서 프로그램 을 만 들 었 습 니 다.Swoole 의 응용 프로그램 과 똑 같 을 수 있 습 니 다.-또 하나의 서버 가 있 습 니 다.index.html 를 정적 파일 로 제공 합 니 다.모두 세 개의 독립 된 용기 에서 실 행 됩 니 다.
그리고 나 서 나 는 wrk 도구 로 이 용기 들 에 압력 테스트 를 했다.결 과 는 충격 적 이 었 다.
스 울 의 작업 성능 은 예상 보다 훨씬 좋 습 니 다!
이것 은 사람 을 놀 라 게 한다.나 는 스 울 이 Nginx 를 뛰 어 넘 을 줄 은 생각 하지 못 했 지만,그것 은 확실히 해 냈 다!이것 도 노드 를 훨씬 앞 질 렀 다.이 확장 기능 은 확실히 인상적 이지 만,요청 에서 더 많은 작업 을 마 친 후에 점차 사 라 졌 다.불 행 히 도 스 울 은 두 가지 작은 단점 이 있어 서 이러한 단점 과 원시 기준 을 약간 어 긋 나 게 한다.우 리 는 잠시 후에 그들 을 찾 을 것 이다.
Websocket 서비스 에서 Swoole 사용 하기
앞에서 말 한 바 와 같이 Swoole 은 웹 소켓 서버 를 만 드 는 방법 을 제공 합 니 다.HTTP 프로 토 콜 과 Swoole 부분 방법 에 따라 비동기 방식 으로 작업 합 니 다.내 가 보기에 그것 은 가장 중요 한 Swoole 구성 요소 중의 하나 이다.자,PHP 에서 실행 중인 웹 소켓 은 어떻게 될 까?그것 의 결 과 를 봅 시다.
<?php
$server = new swoole_websocket_server('php', 9501);
$server->on('start', function (swoole_websocket_server $server) {
echo "Server has been started!
";
});
$server->on('open', function (swoole_websocket_server $server, $request) {
echo "websocket: new connection, id: {$request->fd}
";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
echo "websocket: {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
$server->push($frame->fd, "Replying, you sent " . $frame->data);
});
$server->on('close', function (swoole_websocket_server $server, $fd) {
echo "websocket: connection with id {$fd} has been closed
";
});
$server->start();
HTTP 서버 와 유사 한 예제 로 보 입 니 다.우선,웹 소켓 서버 와 유사 한 swoole 을 만 듭 니 다.websocket_server 대상.그리고 우 리 는 4 개의 익명 함 수 를 4 개의 사건 에 연결 했다.첫 번 째 시작 이 벤트 는 HTTP 서버 의 시작 이벤트 처럼 작 동 합 니 다.두 번 째 실행 이 벤트 는 다른 웹 소켓 에 연결 한 후에 실 행 됩 니 다.세 번 째 메시지 이 벤트 는 웹 소켓 이 서버 에 메 시 지 를 보 낼 때 실 행 됩 니 다.마지막 으로 닫 는 시간 은 웹 소켓 이 연결 을 끊 을 때 실 행 됩 니 다.
ID 는 웹 소켓 으로 서버 에 연 결 된 유일한 표지 로 서 이 ID 는 모든 새로운 웹 소켓 에 따라 증가 합 니 다.
질문
지금까지 이 모든 것 이 잘 작 동 되 었 으 나 스 울 테스트 를 통 해 일부 솔 루 션 을 테스트 할 때 두 가지 문제 가 발생 했다.나 는 그것 을 열거 했다.
두 번 째 문 제 는 더욱 까다롭다.Swoole 은 HTTP 요청 을 처리 하 는 작업 프로 세 스 를 생 성 합 니 다.이것 은 우리 가 전체 변 수 를 만 들 면 스 레 드 사이 에 값 이 독립 되 고 일 을 할 수 없다 는 것 을 의미 합 니 다.아래 의 이 코드 는 문제 의 소 재 를 표시 하 는 것 이다.
<?php
$server = new swoole_websocket_server('php', 9501);
$server->on('start', function (swoole_websocket_server $server) {
echo "Server has been started!
";
});
$server->on('open', function (swoole_websocket_server $server, $request) {
echo "websocket: new connection, id: {$request->fd}
";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
echo "websocket: {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
$server->push($frame->fd, "Replying, you sent " . $frame->data);
});
$server->on('close', function (swoole_websocket_server $server, $fd) {
echo "websocket: connection with id {$fd} has been closed
";
});
$server->start();
예상 되 는 응답 정 보 는 0 으로 돌아 가 1,2,3 등 으로 돌아 가지 만 항상 0 으로 돌아 갑 니 다.나 는 그것 이 bug 인지 아 닌 지 를 검사 하기 위해 Swoole 의 작 가 를 찾 았 지만 사실은 그렇지 않 았 다.우리 가 원 하 는 행동 을 얻 기 위해 서 는 설정 에 워 커 를 설정 할 수 있 습 니 다.num=1 이지 만 일부 성능 이 떨 어 집 니 다.
결론.
전반적 으로 스 울 은 밝 은 측면 도 있 고 어두 운 구석 도 있다.나 는 비동기 프로 그래 밍 을 PHP 에 도입 하 는 것 이 여전히 좋 은 생각 이 라 고 생각한다.이 는 빠 른 디자인 원형,간결 하고 책임 이 단일 한 마이크로 서비스,저 지연 게임 서버 와 대형 프레임 워 크 로 서 의 백 엔 드 서버 를 포함 하여 다양한 상황 에 사용 할 수 있다.확실히 전도 가 유망 하 다.
이상 은 swoole 의 역할 과 원리 에 대한 상세 한 내용 입 니 다.swoole 의 역할 과 원리 에 관 한 자 료 는 다른 관련 글 에 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
tcp 서버 만들기/** * Created by PhpStorm. * User: Administrator * Date: 2018/4/3 * Time: 16:00 */ //创建服务器 TCP服务器 $serv = new swoole_ser...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.