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
<?php namespace AppConsoleCommands; use WorkermanWorker; use PHPSocketIOSocketIO; use IlluminateConsoleCommand; 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(); } }
启动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 AppHttpControllers; use AppHttpControllersController; use IlluminateSupportFacadesDB; use IlluminateHttpRequest; use IlluminateSupportFacadesStorage; /* * 消息提醒通知 * @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有点慢,所以可以访问下面的文档