websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程

Posted 牛奔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程相关的知识,希望对你有一定的参考价值。

websocket 后台新订单通知 —— Laravel 5.8 Laravel-echo-server教程

PHPSocket.IOphp跨平台实时通讯框架

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有点慢,所以可以访问下面的文档

workman PHPSocket.IO文档

以上是关于websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程的主要内容,如果未能解决你的问题,请参考以下文章

springboot整合websocket实现客户端与服务端通信

Thinkphp6+Workerman消息推送

java中的websocket应用

Spring Boot + WebSocket 实时消息推送

Swift - 如何在后台和前台获得某些无声通知?

如何在没有 websocket 的情况下通知