> 백엔드 개발 > PHP 튜토리얼 > PHP Swoole의 기본 사용

PHP Swoole의 기본 사용

Guanhui
풀어 주다: 2023-04-08 16:00:01
앞으로
3384명이 탐색했습니다.

Background

프로젝트에서는 PHP를 사용하지만 시간이 오래 걸리고 작업이 오래 걸리기 때문에 프런트 엔드가 제출된 후 서버가 비동기적으로 응답해야 합니다.

MQ, fsocket, Swoole 등을 포함하여 서버 비동기를 위한 다양한 솔루션이 있습니다.

Swoole은 순수 C 언어로 작성되었으며 PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 비동기 Redis, 데이터베이스 연결 풀, AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기를 제공합니다. , 비동기 DNS 쿼리. Swoole에는 Http/WebSocket 서버/클라이언트 및 Http2.0 서버가 내장되어 있습니다.

가장 중요한 것은 PHP 언어를 완벽하게 지원한다는 점입니다. 그래서 저는 Swoole을 사용하여 비동기 응답, 푸시, 예약 작업과 같은 일련의 작업을 제공하는 비동기 서버를 구축했습니다.

Installation

Swoole은 C 언어로 작성되었으며 컴파일과 설치를 사용합니다.

설치 종속성은 다음과 같습니다:

php-5.3.10 이상 버전

gcc-4.4 이상 버전

make

autoconf

pcre (centos 시스템은 다음 명령을 실행할 수 있습니다: yum install pcre-devel)

설치방법 :

phpize #명령어가 없으면 앞에 실제 php 경로를 추가해주세요

./configure

make

sudo make install

컴파일 완료 후 확장자를 추가해야 합니다 php.ini

Extension=swoole.so

Use

server

class Server{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
 
            //'worker_num' => 1,  //一般设置为服务器CPU数的1-4倍
 
            'daemonize' => 1,  //以守护进程执行
            'max_request' => 10000,
            'task_worker_num' => 1,  //task进程的数量
 
            "task_ipc_mode " => 3 ,  //使用消息队列通信,并设置为争抢模式
            'open_length_check'    => true,
            'dispatch_mode'        => 1,
 
            'package_length_type'  => 'N',  //这个很关键,定位包头的
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
 
            'package_max_length'    => 2000000,  //协议最大长度
            "log_file" => "/tmp/swoole_test.log"  //日志
 
        ));
 
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Task', array($this, 'onTask'));
        $this->serv->on('Finish', array($this, 'onFinish'));
        $this->serv->start();
 
    }
 
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
 
        //放入任务队列,开始执行
        $task_id = $serv->task( $data );
 
    }
 
    public function onTask($serv,$task_id,$from_id, $data) {
      //做一些事情
 
    }
로그인 후 복사

client

class Client{
 
    private $client, $ip, $port, $params;
 
    public function __construct($ip, $port, $params)
    {
 
        $this->ip = $ip;
        $this->port = $port;
        $this->params = $params;
 
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->set(array(
            'open_length_check'    => true,
            'package_length_type'  => 'N',
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
            'package_max_length'    => 2000000,  //协议最大长度
 
        ));
 
        //设置事件回调函数
 
        $this->client->on('Connect', array($this, 'onConnect'));
        $this->client->on('Receive', array($this, 'onReceive'));
        $this->client->on('Close', array($this, 'onClose'));
        $this->client->on('Error', array($this, 'onError'));
 
        //发起网络连接
        $this->client->connect($ip, $port, 3);
    }
 
    public function onReceive( $cli, $data ) {
        echo "Received: " . $data . "\n";
 
    }
 
    public function onConnect($cli) {
 
        $data = pack('N', strlen($data)) . $data;
        $cli->send($data);
        $cli->close();
 
    }
 
    public function onClose( $cli)
    {
        echo "Connection close\n";
    }
 
    public function onError()
    {
        echo "Connect failed\n";
    }
 
}
로그인 후 복사

주의 문제

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N个字节是包长度的值
'package_body_offset'  => 4,      //第几个字节开始计算长度
'package_max_length'    => 2000000,  //协长度
로그인 후 복사

Swoole의 클라이언트와 서버 통신은 TCP 연결이므로 프레임 구분을 정의하므로 다음을 수행해야 합니다. 프레임 구분자를 지정하세요. 자세한 내용은 Swoole 공식 문서를 참조하세요. 머리로 길이를 추가하는 방법은 다음과 같습니다.

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

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