Maison  >  Article  >  cadre php  >  Pourquoi Swoole est-il passé du début à l'abandon ?

Pourquoi Swoole est-il passé du début à l'abandon ?

coldplay.xixi
coldplay.xixiavant
2020-12-09 17:37:263638parcourir

Tutoriel swoolePrésentation des raisons pour lesquelles, du début à l'abandon

Pourquoi Swoole est-il passé du début à l'abandon ?

Recommandé (gratuit) : Tutoriel swoole

1. Installation du paquet source swoole

  1. Téléchargez le code source swoole : git clone https://gitee.com/swoole/swoole.git
  2. Via phpize (étendre le module d'extension php, créer un module de plug-in php) :

    • cd swoole
    • Exécution : your/phpize/path
    • ./configure --with-php-config=your/php/path/bin/php-config
    • make && make install
  3. Vous pouvez voir l'emplacement de swoole.so

    • Mon emplacement est : /opt/soft/php/lib/php/extensions/no-debug-non-zts-20170718/
  4. Configuration php.ini

    • Ajouter extension=swoole.so
  5. Grâce à la commande php -m, vous pouvez voir le module d'extension php
  6. Détecter que swoole est installé avec succès et que php prend en charge swoole

    • cd your/swoole/path/examples/server
    • php echo.php (si le processus est bloqué, cela signifie succès)
    • netstat -anp | grep 9501 (Afficher le numéro de port ouvert par swoole)

2. Moteur de communication réseau

Pour apprendre swoole, vous besoin de lire la documentation. document swoole

1. Créez le service TCP le plus simple via swoole

serveur TCP (tcp_server.php)
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

$serv->set([
    'worker_num' => 4, // worker进程数,cpu 1-4倍
    'max_request' => 100,
]);

/**
 * 监听连接进入事件
 * $fd 客户端连接服务端的唯一标识
 * $reactor_id 线程id
 */
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$fd} - {$reactor_id} - Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$serv->start();
client TCP (tcp_client.php)
// 创建tcp客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);

// 连接tcp服务端
if (!$client->connect("127.0.0.1", 9501)) {
    echo '连接失败';
    exit;
}

// php cli
fwrite(STDOUT, '请输入:');
$msg = trim(fgets(STDIN));

// 发送消息给tcp服务端
if (!$client->send($msg)) {
    echo '发送消息失败';
    exit;
}

// 接收
$result = $client->recv();
echo $result;

2. Extension : Quatre rappels de php

  • Fonction anonyme
$server->on('Request', function ($req, $resp) {
    echo "hello world";
});
  • Méthode statique de classe
class A
{
    static function test($req, $resp)
    {
        echo "hello world";
    }
}
$server->on('Request', 'A::Test');
$server->on('Request', array('A', 'Test'));
  • Fonction
function my_onRequest($req, $resp)
{
    echo "hello world";
}
$server->on('Request', 'my_onRequest');
  • Méthode objet
class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on('Request', array($object, 'test'));
Conseils : Affichez les processus de travail ouverts : ps aft | grep tcp_server.php

3 Le serveur et le client udp peuvent être créés par vous-même selon la documentation


4. Service http

// 监听所有地址和9501端口
$http = new swoole_http_server('0.0.0.0', 9501);

// 动静分离配置
$http->set([
    // 开启静态请求
    'enable_static_handler' => true,
    // 静态资源目录
    'document_root' => '/opt/app/code1/',
]);

$http->on('request', function ($request, $response) {
    // 获取get请求的参数
    $param = json_encode($request->get);
    // 设置cookie
    $response->cookie('name', 'ronaldo', time() + 1800);
    // 输出到页面
    $response->end("<h1>Hello Swoole - {$param}</h1>");
});

// 开启http服务
$http->start();


5. Créer un service websocket via swoole

serveur websocket (websocket_server.php)
// 监听所有地址和9502端口
$server = new swoole_websocket_server('0.0.0.0', 9502);

// 动静分离配置
$server->set([
    // 开启静态请求
    'enable_static_handler' => true,
    // 静态资源目录
    'document_root' => '/opt/app/swoole/websocket',
]);
$server->on('open', function ($server, $request) {
    echo "server:handshake success with fd - {$request->fd}\n";
});

$server->on('message', function ($server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "this is server");
});

$server->on('close', function ($server, $fd) {
    echo "client - {$fd} - close\n";
});

$server->start();
client websocket ( websockt_client.html)
// 创建websocket实例
        var websocketURL = "ws://www.rona1do.top:9502";
        var websocket = new WebSocket(websocketURL);

        // 实例化对象的onopen属性
        websocket.onopen = function (ev) {
            websocket.send("hello-websocket");
            console.log("connect-swoole-success");
        }

        // 实例化对象的onmessage属性,接收服务端返回的数据
        websocket.onmessage = function (ev) {
            console.log("websockect-server-return-data:" + ev.data);
        }

        // close
        websocket.onclose = function (ev) {
            console.log("close");
        }

6. Utiliser l'orientation objet pour optimiser le code du service Websocket

class WebSocket {
    const HOST = '0.0.0.0';
    const PORT = 9502;

    private $ws = null;

    function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('close', [$this, 'onClose']);
        $this->ws->start();
    }

    // 监听websocket连接事件
    function onOpen($server, $request) {
        echo "server: handshake success with fd{$request->fd}\n";
    }

    // 监听websocket消息接收事件
    function onMessage($server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
        $server->push($frame->fd, "this is server");
    }

    // 监听客户端关闭事件
    function onClose($server, $fd) {
        echo "Client:{$fd} closes\n";
    }
}


7. Cas de tâche dans swoole

onTask : est appelé dans le processus task_worker. Le processus de travail peut utiliser la fonction swoole_server_task pour fournir de nouvelles tâches au processus task_worker. Lorsque le processus de tâche actuel appelle la fonction de rappel onTask, il fera passer l'état du processus à occupé et ne recevra plus de nouvelles tâches. Lorsque la fonction onTask reviendra, elle fera passer l'état du processus à inactif et continuera à recevoir de nouvelles tâches.
onFinish : Lorsque la tâche délivrée par le processus de travail est terminée dans task_worker, le processus de tâche enverra le résultat du traitement de la tâche au processus de travail via la méthode swoole_server->finish() .
class Websocket {

    const HOST = '0.0.0.0';
    const PORT = 9502;
    private $ws = null;

    public function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->set([
            'worker_num' => 2,
            'task_worker_num' => 2, // 要想使用task必须要指明
        ]);
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('task', [$this, 'onTask']);
        $this->ws->on('finish', [$this, 'onFinish']);
        $this->ws->on('close', [$this, 'onClose']);
        $this->ws->start();
    }

    public function onOpen($server, $request)
    {
        echo "server:handshake success with fd:{$request->fd}\n";
    }

    public function onMessage($server, $frame)
    {
        echo "receive from {$frame->fd}:{$frame->data}\n";

        // 需要投递的任务数据
        $data = [
            'fd' => $frame->fd,
            'msg' => 'task',
        ];
        $server->task($data);

        $server->push($frame->fd, 'this is server');
    }

    // 处理投递的任务方法,非阻塞
    public function onTask($server, $task_id, $worker_id, $data)
    {
        print_r($data);
        // 模拟大量数据的操作
        sleep(10);
        return "task_finish";
    }
    
    // 投递任务处理完毕调用的方法
    public function onFinish($server, $task_id, $data)
    {
        echo "task_id:{$task_id}\n";
        echo "task finish success:{$data}\n";
    }
    
    public function onClose($server, $fd)
    {
        echo "Client:close";
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer