Heim  >  Artikel  >  PHP-Framework  >  So verwenden Sie die Swoole-Aufgabe

So verwenden Sie die Swoole-Aufgabe

(*-*)浩
(*-*)浩Original
2019-12-06 09:25:393174Durchsuche

So verwenden Sie die Swoole-Aufgabe

Swoole Task-Anwendung.

Swoole asynchrone Aufgabe, implementiert hauptsächlich die Ausführung aufrufender asynchroner Aufgaben. (Empfohlenes Lernen: Swoole-Video-Tutorial )

Häufig verwendete Szenarien: asynchrone Zahlungsabwicklung, asynchrone Auftragsabwicklung, asynchrone Protokollverarbeitung, asynchroner Versand von E-Mails/SMS-Nachrichten usw.

Swoole wird implementiert, indem der Arbeitsprozess die Datenanforderung verarbeitet und sie dem Aufgabenprozess zur Ausführung zuweist.

Offizielle Einführung:

Aufgabe verwendet die Unix-Socket-Pipe-Kommunikation auf der untersten Ebene, die über vollen Speicher verfügt und keinen E/A-Verbrauch aufweist. Die Lese- und Schreibleistung eines einzelnen Prozesses kann 1 Million/s erreichen. Verschiedene Prozesse nutzen unterschiedliche Pipelines für die Kommunikation, wodurch die Nutzung mehrerer Kerne maximiert werden kann.

Lokale Version: PHP 7.2.6, Swoole 4.3.1.

Da gibt es nicht viel zu sagen, werfen wir zunächst einen Blick auf die Renderings:

Code

server.php

class Server
{
    private $serv;

    public function __construct() {
        $this->serv = new swoole_server('0.0.0.0', 9501);
        $this->serv->set([
            'worker_num'      => 2, //开启2个worker进程
            'max_request'     => 4, //每个worker进程 max_request设置为4次
            'task_worker_num' => 4, //开启4个task进程
            'dispatch_mode'   => 2, //数据包分发策略 - 固定模式
        ]);

        $this->serv->on('Start', [$this, 'onStart']);
        $this->serv->on('Connect', [$this, 'onConnect']);
        $this->serv->on("Receive", [$this, 'onReceive']);
        $this->serv->on("Close", [$this, 'onClose']);
        $this->serv->on("Task", [$this, 'onTask']);
        $this->serv->on("Finish", [$this, 'onFinish']);

        $this->serv->start();
    }

    public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onConnect($serv, $fd) {
        echo "#### onConnect ####".PHP_EOL;
        echo "客户端:".$fd." 已连接".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onReceive($serv, $fd, $from_id, $data) {
        echo "#### onReceive ####".PHP_EOL;
        echo "worker_pid: {$serv->worker_pid}".PHP_EOL;
        echo "客户端:{$fd} 发来的Email:{$data}".PHP_EOL;
        $param = [
            'fd'    => $fd,
            'email' => $data
        ];
        $rs = $serv->task(json_encode($param));
        if ($rs === false) {
            echo "任务分配失败 Task ".$rs.PHP_EOL;
        } else {
            echo "任务分配成功 Task ".$rs.PHP_EOL;
        }
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onTask($serv, $task_id, $from_id, $data) {
        echo "#### onTask ####".PHP_EOL;
        echo "#{$serv->worker_id} onTask: [PID={$serv->worker_pid}]: task_id={$task_id}".PHP_EOL;

        //业务代码
        for($i = 1 ; $i <= 5 ; $i ++ ) {
            sleep(2);
            echo "Task {$task_id} 已完成了 {$i}/5 的任务".PHP_EOL;
        }

        $data_arr = json_decode($data, true);
        $serv->send($data_arr[&#39;fd&#39;] , &#39;Email:&#39;.$data_arr[&#39;email&#39;].&#39;,发送成功&#39;);
        $serv->finish($data);
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onFinish($serv,$task_id, $data) {
        echo "#### onFinish ####".PHP_EOL;
        echo "Task {$task_id} 已完成".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onClose($serv, $fd) {
        echo "Client Close.".PHP_EOL;
    }
}

$server = new Server();

client.php

<?php
class Client
{
    private $client;
    public function __construct() {
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->on(&#39;Connect&#39;, [$this, &#39;onConnect&#39;]);
        $this->client->on(&#39;Receive&#39;, [$this, &#39;onReceive&#39;]);
        $this->client->on(&#39;Close&#39;, [$this, &#39;onClose&#39;]);
        $this->client->on(&#39;Error&#39;, [$this, &#39;onError&#39;]);
    }
    public function connect() {
        if(!$fp = $this->client->connect("127.0.0.1", 9501 , 1)) {
            echo "Error: {$fp->errMsg}[{$fp->errCode}]".PHP_EOL;
            return;
        }
    }
    public function onConnect($cli) {
        fwrite(STDOUT, "输入Email:");
        swoole_event_add(STDIN, function() {
            fwrite(STDOUT, "输入Email:");
            $msg = trim(fgets(STDIN));
            $this->send($msg);
        });
    }
    public function onReceive($cli, $data) {
        echo PHP_EOL."Received: ".$data.PHP_EOL;
    }
    public function send($data) {
        $this->client->send($data);
    }
    public function onClose($cli) {
        echo "Client close connection".PHP_EOL;
    }
    public function onError() {
    }
}
$client = new Client();
$client->connect();

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Swoole-Aufgabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:was ist swoole fdNächster Artikel:was ist swoole fd