websocket 后台新訂單通知 —— Laravel 5.8 Laravel-echo-server教程
PHPSocket.IO,PHP跨平台實時通訊框架
PHPSocket.IO是PHP版本的Socket.IO服務端實現,基於workerman開發,用於替換node.js版本Socket.IO服務端。
PHPSocket.IO底層采用websocket協議通訊,如果客戶端不支持websocket協議, 則會自動采用http長輪詢的方式通訊。
環境
- Laravel 5.8
- PHPSocket.IO 1.1
安裝依賴
composer require workerman/phpsocket.io
composer require guzzlehttp/guzzle
啟動程序整合到artisan命令中
創建文件命令 php artisan make:command WorkermanCommand
app/Console/Commands/WorkermanCommand.php
workman PHPSocket.Io服務命令行啟動程序
<?php namespace App\Console\Commands; use Workerman\Worker; use PHPSocketIO\SocketIO; use Illuminate\Console\Command; // class WorkermanCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'workman {action=start : start | restart | reload(平滑重啟) | stop | status | connetions} {--d : deamon or debug}'; /** * The console command description. * * @var string */ protected $description = 'workman'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // 如果你在windows啟動命令行,需要注釋這一行服務才能啟動 global $argv; //啟動php腳本所需的命令行參數 $argv[0] = 'workman'; $argv[1] = $this->argument('action'); // start | restart | reload(平滑重啟) | stop | status | connetions $argv[2] = $this->option('d') ? '-d' : ''; // 守護進程模式或調試模式啟動 // https需要加上證書驗證 if (env('APP_HEADER', 'http') == 'https') { $context = array( 'ssl' => array( 'local_cert' => '/etc/nginx/ssl/fullchain_all.pem', 'local_pk' => '/etc/nginx/ssl/privkey_all.pem', 'verify_peer' => false, ) ); $io = new SocketIO(6001, $context); } else { $io = new SocketIO(6001); } $io->on('workerStart', function () use ($io) { // 同時啟動一個worker監聽 $inner_http_worker = new Worker('http://0.0.0.0:6002'); $inner_http_worker->onMessage = function ($http_connection, $request) use ($io) { // 接受推送過來的數據 $get = $request->get(); if (isset($get['type']) && !empty($get['type'])) { // 向客戶端發送響應事件請求,第二參數可以攜帶參數 $io->emit($get['type']); } if ($io) { return $http_connection->send('ok'); } return $httpConnection->send('fail'); }; $inner_http_worker->listen(); }); Worker::runAll(); } } workman PHPSocket.Io服務命令行啟動程序
啟動PHPSocket.Io服務
#以守護進程模式啟動 php artisan workman start -d #以調式模式啟動 php artisan workman start #終止 php artisan workman stop #平滑重啟 php artisan workman reload
web頁面
<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script> <script> // 連接服務端,如果是https請求則必須使用域名請求,證書是要驗證域名的 var socket = io('http://127.0.0.1:6001'); // 觸發服務端的chat message事件 socket.emit('chat message', '這個是消息內容...'); // 服務端通過emit('chat message from server', $msg)觸發客戶端的chat message from server事件 socket.on('chat message from server', function(msg){ console.log('get message:' + msg + ' from server'); }); </script>
打開web頁面看看socket是否連接成功
推送消息
在laravel api層新建了一個NoticeController.php 用來發送響應事件
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; /* * 消息提醒通知 * @author niuben */ class NoticeController extends Controller { const URL = "http://127.0.0.1:6002"; /* * 發送消息通知 * @request post * @param type * */ public function setNotices(Request $request) { $post = $request->post(); if (!isset($post['type']) || empty($post['type'])) { return ['code' => 200404, 'msg' => '參數缺失']; } $message_request = $this->curl_get(self::URL . '?type='.$post['type']); if($message_request !='ok'){ return ['code' => 5324, 'msg' => '提醒發送失敗']; } return ['code' => 200, 'msg' => '成功']; } /* * curl get請求 */ public function curl_get($url) { $header = array( 'Accept: application/json', ); $curl = curl_init(); //設置抓取的url curl_setopt($curl, CURLOPT_URL, $url); //設置頭文件的信息作為數據流輸出 curl_setopt($curl, CURLOPT_HEADER, 0); // 超時設置,以秒為單位 curl_setopt($curl, CURLOPT_TIMEOUT, 1); // 超時設置,以毫秒為單位 // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500); // 設置請求頭 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //設置獲取的信息以文件流的形式返回,而不是直接輸出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //執行命令 $data = curl_exec($curl); curl_close($curl); return $data; } }
這時候請求api,傳入 type=chat message from server ,看看客戶端是否打印出數據
這里是https://github.com/walkor/phpsocket.io/tree/master/docs/zh PHPSocket.IO文檔,最近GitHub有點慢,所以可以訪問下面的文檔