Laravel後臺作為客戶端,socket.io作為服務端,App或其他作為另一個客戶端

lvjie1996發表於2020-07-20

簡介

laravel API 與 Android App 進行通訊,推送訊息,或者是其他的使用的場景。

1.後臺安裝所需

    1. 新建 Laravel 專案
      composer create-project laravel/laravel demo --prefer-dist
    1. 安裝 redis
      composer require predis/predis
    1. 配置 redis
      修改 config/database.php
      'redis' => [
         'client' => env('REDIS_CLIENT', 'phpredis'),
         'options' => [
         'cluster' => env('REDIS_CLUSTER', 'redis'),
         // 'prefix' => env(...)   註釋掉這一行
         ],
         ...
      ]
    1. 修改 App\Providers\EventServiceProvider.php 中的 $listen
      protected $listen = [
         'App\Events\TestEvent' => [
             'App\Listeners\TestEventListener',
         ],
      ];
      然後使用命令自動生成 EventsListeners檔案
      php artisan event:generate
    1. TestEvent.php 實現

      <?php
      namespace App\Events;
      use ...class TestEvent implements ShouldBroadcast
      {
         use ...public $token;
         protected $channel;
      
         public function __construct($token, $channel)
         {
             $this->token = $token;
             $this->channel = $channel;
         }
      
         public function broadcastOn()
         {
             return [$this->channel];
         }
      }
    1. TestEventListener.php 實現

      <?php
      namespace App\Listeners;
      use App\Events\TestEvent;
      use ...class TestEventListener implements ShouldQueue
      {
         use InteractsWithQueue;
         protected $request;
      
         public function __construct(Request $request)
         {
             $this->request = $request;
         }
      
         public function handle(TestEvent $event){}
      
         public function log($event){
             info("event -------- ".$event->token);
         }
      
         public function subscribe($events)
         {
             $events->listen(
                 TestEvent::class,
                 'App\Listeners\TestEventListener@log'
             );
         }
      }
    1. EventServiceProvider.php 中新增或修改
      protected $subscribe = [
         TestEventListener::class,
      ];
    1. 修改 .envBROADCAST_DRIVER 為 redis

      2.socket 伺服器

    1. 新建 node 專案
      新建 demo 目錄,在目錄中新建 package.json 檔案,並輸入
      {
       "name": "demo",
       "version": "0.0.1",
       "description": "socket server",
       "dependencies": {}
      }
    1. socket 伺服器安裝所需
      npm install --save express
      npm install --save socket.io
      npm install --save ioredis
    1. 新建 app.js

      // app.js
      var app = require('http').createServer(handler);
      var io = require('socket.io')(app);
      var Redis = require('ioredis');
      var redis = new Redis({
         port: 6379,          // Redis port
         host: '127.0.0.1',   // Redis host
         password:null,
         db: 0,
      });
      
      app.listen(3000, function () {
       console.log('Server is running!') ;
      });
      
      function handler(req, res) {
       res.writeHead(200);
       res.end('');
      }
      
      io.on('connection', function (socket) {
       socket.on('message', function (message) {
         // 一般這裡要做一些處理
         console.log(message)
       })
       socket.on('disconnect', function () {
         console.log('user disconnect')
       })
      });
      
      redis.psubscribe('*', function (err, count) {});
      
      redis.on('pmessage', function (subscrbed, channel, message) {
       message = JSON.parse(message);
       var obj = {
         channel : channel,
         message:message
       };
       io.emit("message",JSON.stringify(obj));
      });

      使用node app.js執行該服務或使用 pm2 方式

    1. js客戶端頁面 其他型別客戶端類似
      // 網上有線上jquery和socket.io可用
      <script type="text/javascript" src="jquery.js"></script>
      <script type="text/javascript" src="socket.io.js"></script>
      <script type="text/javascript">
      $(function(){
         var socket = io.connect('http://0.0.0.0:3000');
         socket.on('message', function (data) {
           console.log("接收到通知:"+data);
           alert("收到通知");
         });
      });
      </script>
    1. 在需要執行的地方使用 event()
      event(new TestEvent("content", "channel_1"));
      也可以在輸入php artisan tinker進入tinker後,輸入
      event(new App\Events\TestEvent("content", "channel_1"));
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章