簡介
laravel API 與 Android App 進行通訊,推送訊息,或者是其他的使用的場景。
1.後臺安裝所需
- 新建 Laravel 專案
composer create-project laravel/laravel demo --prefer-dist
- 新建 Laravel 專案
- 安裝 redis
composer require predis/predis
- 安裝 redis
- 配置 redis
修改 config/database.php'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), // 'prefix' => env(...) 註釋掉這一行 ], ... ]
- 配置 redis
- 修改 App\Providers\EventServiceProvider.php 中的
$listen
然後使用命令自動生成protected $listen = [ 'App\Events\TestEvent' => [ 'App\Listeners\TestEventListener', ], ];
Events
和Listeners
檔案php artisan event:generate
- 修改 App\Providers\EventServiceProvider.php 中的
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]; } }
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' ); } }
- 在 EventServiceProvider.php 中新增或修改
protected $subscribe = [ TestEventListener::class, ];
- 在 EventServiceProvider.php 中新增或修改
- 新建 node 專案
新建 demo 目錄,在目錄中新建 package.json 檔案,並輸入{ "name": "demo", "version": "0.0.1", "description": "socket server", "dependencies": {} }
- 新建 node 專案
- socket 伺服器安裝所需
npm install --save express npm install --save socket.io npm install --save ioredis
- socket 伺服器安裝所需
新建 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 方式
- 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>
- js客戶端頁面 其他型別客戶端類似
- 在需要執行的地方使用
event()
也可以在輸入event(new TestEvent("content", "channel_1"));
php artisan tinker
進入tinker
後,輸入event(new App\Events\TestEvent("content", "channel_1"));
- 在需要執行的地方使用
本作品採用《CC 協議》,轉載必須註明作者和本文連結