Maison  >  Article  >  développement back-end  >  Utiliser Laravel + Swoole pour implémenter le push de message actif Websocket

Utiliser Laravel + Swoole pour implémenter le push de message actif Websocket

angryTom
angryTomavant
2019-11-29 16:36:253543parcourir

Récemment, il y a une demande : je souhaite implémenter une fonction qui peut déclencher activement le push de message. Cela peut être implémenté en envoyant un modèle de message à tous les membres, sans envoyer de message via le client Dans. message, écoutez le message transmis et exécutez la logique métier correspondante.

Utiliser Laravel + Swoole pour implémenter le push de message actif Websocket

Implémentation active du message push

Habituellement, nous utilisons swoole pour écrire WebSocket Le service peut utiliser le plus les trois états d'écoute d'ouverture, de message et de fermeture, mais ne regardez jamais l'utilisation du rappel onRequest ci-dessous. Oui, c'est ce qui est nécessaire pour résoudre ce message actif. Utilisez le rappel onRequest.

Document officiel : Comme swoole_websocket_server hérite de swoole_http_server, il existe un rappel onRequest dans websocket.

Implémentation détaillée :

# 这里是一个laravel中Commands
# 运行php artisan swoole start 即可运行
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use swoole_websocket_server;

class Swoole extends Command
{
    public $ws;
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = &#39;swoole {action}&#39;;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;Active Push Message&#39;;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $arg = $this->argument(&#39;action&#39;);
        switch ($arg) {
            case &#39;start&#39;:
                $this->info(&#39;swoole server started&#39;);
                $this->start();
                break;
            case &#39;stop&#39;:
                $this->info(&#39;swoole server stoped&#39;);
                break;
            case &#39;restart&#39;:
                $this->info(&#39;swoole server restarted&#39;);
                break;
        }
    }

    /**
     * 启动Swoole
     */
    private function start()
    {
        $this->ws = new swoole_websocket_server("0.0.0.0", 9502);
        //监听WebSocket连接打开事件
        $this->ws->on(&#39;open&#39;, function ($ws, $request) {
        });
        //监听WebSocket消息事件
        $this->ws->on(&#39;message&#39;, function ($ws, $frame) {
            $this->info("client is SendMessage\n");
        });
        //监听WebSocket主动推送消息事件
        $this->ws->on(&#39;request&#39;, function ($request, $response) {
            $scene = $request->post[&#39;scene&#39;];       // 获取值
            $this->info("client is PushMessage\n".$scene);
        });
        //监听WebSocket连接关闭事件
        $this->ws->on(&#39;close&#39;, function ($ws, $fd) {
            $this->info("client is close\n");
        });
        $this->ws->start();
    }
}

Ce que j'ai mentionné ci-dessus est l'implémentation de onRequest dans swoole. L'implémentation suivante déclenche activement le rappel onRequest dans le contrôleur. La méthode d'implémentation est la requête curl que nous connaissons.

# 调用activepush方法以后,会在cmd中打印出 
# client is PushMessage 主动推送消息 字眼
    /**
     * CURL请求
     * @param $data
     */
    public function curl($data)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_exec($curl);
        curl_close($curl);
    }
    
    /**
     * 主动触发
     */
    public function activepush()
    {
        $param[&#39;scene&#39;] = &#39;主动推送消息&#39;;
        $this->curl($param);            // 主动推送消息

Objectif
le rappel onRequest est particulièrement adapté aux messages push qui doivent être appelés dans le contrôleur, tels que les messages modèles, etc., qui sont appelés dans le contrôleur.

Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois !

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