GVKun编程网logo

想要在Laravel中实现Web套接字(laravel接口文档)

34

这篇文章主要围绕想要在Laravel中实现Web套接字和laravel接口文档展开,旨在为您提供一份详细的参考资料。我们将全面介绍想要在Laravel中实现Web套接字的优缺点,解答laravel接口

这篇文章主要围绕想要在Laravel中实现Web套接字laravel接口文档展开,旨在为您提供一份详细的参考资料。我们将全面介绍想要在Laravel中实现Web套接字的优缺点,解答laravel接口文档的相关问题,同时也会为您带来.net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”、Ajax对Web套接字与Web Workers、javascript – 从Web套接字动态更新模型、laravels实现WebSocket,IM通讯的实用方法。

本文目录一览:

想要在Laravel中实现Web套接字(laravel接口文档)

想要在Laravel中实现Web套接字(laravel接口文档)

我想使用网络套接字在Laravel中实现网络通知。我尝试过推杆。这很容易,但是它是付费的。我还尝试了redis和socket.io,必须为其安装Horizo​​n。我正在运行Windows,但根据我对地平线的了解,无法在Windows上安装它。

所以我对推送通知非常困惑。我正在尝试至少一个星期,但尚未找到任何解决方案。我的前端在angluar 5 / android中,后端在Laravel
5.6中。

您能否建议我一些实施推送通知的好主意?

答案1

小编典典

您一直在使用pusher,所以我假设您知道如何使用事件。

我建议您使用laravel-echo-server。它非常易于使用,并带有内置api。

这是一个从头开始的laravel-echo项目的新示例。设置项目后。

如果尚未安装,则需要predis

    composer require predis/predis    redis-server /usr/local/etc/redis.conf
  1. npm install -g laravel-echo-server
  2. laravel-echo-server init
  3. 取消注释App\Providers\BroadcastServiceProvider::classconfig/app.php
  4. <script src="https://cdn.jsdelivr.net/npm/socket.io-client@2.1.1/dist/socket.io.js"></script>在您的app.blade.php中添加
  5. 您需要一个socketio-client,可以运行npm install --save laravel-echo。如果您不熟悉npm或vue,则可以从我的github项目中简单地包含此编译文件。编译js
  6. 将此添加到app.blade.php
        <script>    window.Echo = new Echo({    broadcaster: ''socket.io'',    host: ''{{url(''/'').'':6001''}}'',    });    Echo.private(`App.User.{{Auth::id()}}`) // private channel    .listen(''NewMessage'', (e) => {        console.log(e)    });    </script>
  1. 最终运行laravel-echo-server start并打开您的项目,您将看到
        [20:53:21] - Lv5OKDAcuSLsK1nBAAAE authenticated for: private-        App.User.1    [20:53:21] - Lv5OKDAcuSLsK1nBAAAE joined channel: private-App.User.1
  1. 您可以听任何您想要的事件或其他通知

  2. 这是我的github项目echo-example

添加一些代码,以便您可以使用邮递员向特定的用户发送消息。您可以从chrome控制台查看消息。您可以从github项目屏幕截图中获取更多详细信息

.net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”

.net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”

我在IIS8 / Windows Server 2012上有一个使用SignalR(rc1)的站点.它运行得很好,除了它似乎回落到serverSentEvents并且我希望网络套接​​字真的很糟糕.

我看到一个信号器/协商GET 200响应:
{ “URL”: “/ signalr”,“的ConnectionId”: “b274f430-7d19-40b8-b448-4ea346042547”,“保持活动”:15.0,“disconnectTimeout”:40.0,“TryWebSockets”:真实的,“WebSocketServerUrl”:空,“ProtocolVersion”: “1.1”}

然后我看到一个信号器/连接GET与500和一个异常“不是一个Web套接字请求”:

www.xxxxxx.com/signalr/connect?transport=webSockets\u0026amp;connectionId=56dc6212-387c-43b2-8555-6f8787c9cf17\u0026amp;connectionData=[{\”name\”:\”orderhub\”},{\”name\”:\”systemhub\”}]\u0026amp ; TID = 6

试图直接加载链接给出以下ysod:

然后它开始使用serverSentEvents!有任何想法吗?提前致谢.

解决方法

我们的服务器是负载均衡器的后面. loadbalancer只接受端口80上的HTTP请求.我已经更新了loadbalancer以接受端口80上的所有类型的TCP连接.

结果:WebSockets现在可以在我们的网站上运行!

Ajax对Web套接字与Web Workers

Ajax对Web套接字与Web Workers

三者有什么区别?他们似乎做了同样的事情。为什么和什么时候选择使用一种方法?
AJAX和websockets执行类似的任务 – 它们都建立到服务器的通信通道。 Web工作人员与他们中的任何一个无关,它们只是JS执行的单独线程。

AJAX比websockets更成熟 – 它已经有了更长的时间,并且有更广泛的浏览器支持。 AJAX是面向请求的 – 您向服务器发出请求,服务器响应,并且连接已关闭。另一方面,Websockets建立与服务器的持久连接,您可以通过它连接两个方向的多个消息。

如果要在不阻止浏览器界面的情况下执行处理器密集型任务,Webworkers将非常有用。

javascript – 从Web套接字动态更新模型

javascript – 从Web套接字动态更新模型

更新(高级理念/概念)

总而言之,我希望在控制器中动态更新值,该控制器绑定到Web套接字服务,该值更改.以下是我如何解决问题的尝试以及我所面临的障碍.

我想在每次套接字推送服务中的信息时更新控制器中的视图模型.为了模仿消息的推送,我只是每秒调用一次超时,这反过来增加了服务中的健康值,我验证它在控制台中工作.

虽然控制器内的健康价值永远不会更新,但我却不知道我做错了什么.以下是相关代码的片段.

这是控制器

(function () {
    'use strict';
    angular
        .module('xxx')
        .controller('DashboardController',['$scope','$timeout',"$uibModal","dashboardService","syncService",DashboardController]);

    function DashboardController($scope,$timeout,$uibModal,dashboardService,syncService) {
        var vm = this;

        // VERSIONS
        vm.versions = {};

        // HEALTH
        vm.health= syncService.health;

        // JUMP-START
        activate();

        //////////////

        function activate(){
           getVersions();
        }

        function getVersions(){
            dashboardService.getVersions()
                         .then(function(data) {
                            vm.versions = data;
                            return vm.versions;
                         });
        }

    }
})();

这是服务

(function () {
        'use strict';
        angular
            .module('xxx')
            .service('syncService',['$timeout',syncService]);

        function syncService($timeout) {
            //Init WebSocket
            var self = this;
            self.health= 0;
            updatedStatus();
            ///////////

            ....

        function updatedStatus(){
            $timeout(updatedStatus,1000);
            self.health += 1;
            $timeout(angular.noop);   
        };
    }
})();

更新

我想知道如何在不使用$scope的情况下使其工作.例如以下question中的接受答案

谢谢

解决方法

AFAIK,您需要关注服务变量.这就是我为使其工作而采取的措施:

function DashboardController($scope,syncService) {
    var vm = this;

    // VERSIONS
    vm.versions = {};

    // HEALTH
     vm.syncService = syncService;

     $scope.$watch('vm.syncService.health',function(newHealth,oldHealth){
        vm.health = newHealth;
     })

    // JUMP-START
    activate();

    //////////////

    function activate(){
       getVersions();
    }

    function getVersions(){
        dashboardService.getVersions()
                     .then(function(data) {
                        vm.versions = data;
                        return vm.versions;
                     });
    }

}

我在评论和答案中链接了一个类似的问题,如果您需要多个控制器来了解服务中变量值的任何变化,他们还会讨论使用$broadcast.

laravels实现WebSocket,IM通讯

laravels实现WebSocket,IM通讯

laravels实现WebSocket,IM通讯

1.安装laravels

composer require hhxsv5/laravel-s

PHP artisan laravels publish

2.如果安装缺少扩展config.json下添加配置

"config": {
    "platform": {
        "ext-pcntl": "7.3",        "ext-posix": "7.3"
    }
}

3.上代码

<?PHP
/**
 * Created by PHPStorm.
 * User: Administrator
 * Date: 2021/9/27
 * Time: 17:41
 */

namespace App\Service;


use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
use Illuminate\Support\Facades\Log;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;

class WebSocketService implements WebSocketHandlerInterface
{
    //https://github.com/wenzhizhong/chatce 别人的聊天系统
    public function __construct()
    {

    }

    public function onopen(Server $server, Request $request)
    {
        // 在触发onopen事件之前,建立WebSocket的HTTP请求已经经过了Laravel的路由,
        // 所以Laravel的Request、Auth等信息是可读的,Session是可读写的,但仅限在onopen事件中。
        // \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);
        Log::info('WebSocket 连接建立'.$request->fd);
        Log::info('WebSocket 连接建立');
        $server->push($request->fd, 'Welcome to LaravelS');
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }
    public function onMessage(Server $server, Frame $frame)
    {
        // \Log::info('Received message', [$fram        // \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);
        //
        //        $server->push($frame->fd, $frame->data);e->fd, $frame->finish]);


        //发给一个人
        //$server->push($frame->fd, $frame->data);

        //发给所有用户
        $list = $server->getClientList();

        Log::info('WebSocket 连接建立消息list'.json_encode($list));

        foreach ($list as $row){

            //$server->close($row);

            Log::info('fd'.$row);
            Log::info('fff'.$frame->fd);

            @$server->push($row, $frame->data);
        }





        Log::info('WebSocket 连接建立消息FD'.$frame->fd);
        Log::info('WebSocket 连接建立消息Data'.$frame->data);
//        $arr = [
//            'time' => date('Y-m-d H:i:s')
//        ];
//        $server->push($frame->fd, json_encode($arr));
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }

    public function onClose(Server $server, $fd, $reactorId)
    {
        Log::info('WebSocket 连接关闭--'.$fd);
        Log::info('WebSocket 连接关闭');
        // throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
    }


}

4.html端

<!DOCTYPE html>
<html>
<head>
    <Meta charset="UTF-8">
    <title>Chat Client</title>
</head>
<body>
<div >
    <div id="content" ></div>
    <hr />
    <div >
        <input type="text"  id="message"  placeholder="请输入内容">
        <button type="button"  onclick="sendMessage()">Primary</button>
    </div>
</div>

<script type="text/javascript">
    // 端口和ip地址对应不要写错
    //var webSocket = new WebSocket("ws://172.16.0.100:5201");
    var webSocket = new WebSocket("ws://172.16.0.100/dctrl/ws");
    webSocket.onopen = function (event) {
        console.log('webSocket 连接成功');
    };
    // 连接关闭时触发
    webSocket.onclose = function (event) {
        console.log("WebSocket 关闭连接");
    }

    //收到服务端消息回调
    webSocket.onmessage = function (event) {
        var content = document.getElementById('content');
        content.innerHTML = content.innerHTML.concat('<p >'+event.data+'</p>');
        console.log(event.data)
    }

    var sendMessage = function(){
        var data = document.getElementById('message').value;
        webSocket.send(data);
    }
</script>


</body>
</html>

5.Nginx配置我这用到的是docker容器

upstream swoole {
   #172.200.7.200:5200 PHP容器的laravels
   server 172.200.7.200:5200 weight=5 max_fails=3 fail_timeout=30s;
   keepalive 16;
}

 map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
 }

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root /docker/www/lrms-2008/public;
    index index.PHP index.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /docker/www/lrms-2008/public;
    }

    location / {
        try_files $uri @laravels;
    }

    #用地址代理wss的ip和端口
    location  /dctrl/ws {
        proxy_pass http://172.16.0.100:5201;
        proxy_redirect   off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Origin "";
    }

    location @laravels {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        proxy_pass http://swoole;
    }
}



今天的关于想要在Laravel中实现Web套接字laravel接口文档的分享已经结束,谢谢您的关注,如果想了解更多关于.net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”、Ajax对Web套接字与Web Workers、javascript – 从Web套接字动态更新模型、laravels实现WebSocket,IM通讯的相关知识,请在本站进行查询。

本文标签: