这篇文章主要围绕想要在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接口文档)
- .net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”
- Ajax对Web套接字与Web Workers
- javascript – 从Web套接字动态更新模型
- laravels实现WebSocket,IM通讯
想要在Laravel中实现Web套接字(laravel接口文档)
我想使用网络套接字在Laravel中实现网络通知。我尝试过推杆。这很容易,但是它是付费的。我还尝试了redis和socket.io,必须为其安装Horizon。我正在运行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
- 跑
npm install -g laravel-echo-server
- 跑
laravel-echo-server init
- 取消注释
App\Providers\BroadcastServiceProvider::class
中config/app.php
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2.1.1/dist/socket.io.js"></script>
在您的app.blade.php中添加- 您需要一个socketio-client,可以运行
npm install --save laravel-echo
。如果您不熟悉npm或vue,则可以从我的github项目中简单地包含此编译文件。编译js - 将此添加到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>
- 最终运行laravel-echo-server start并打开您的项目,您将看到
[20:53:21] - Lv5OKDAcuSLsK1nBAAAE authenticated for: private- App.User.1 [20:53:21] - Lv5OKDAcuSLsK1nBAAAE joined channel: private-App.User.1
您可以听任何您想要的事件或其他通知
这是我的github项目echo-example
添加一些代码,以便您可以使用邮递员向特定的用户发送消息。您可以从chrome控制台查看消息。您可以从github项目屏幕截图中获取更多详细信息
.net – SignalR Web套接字IIS8 Server 2012 – “不是Web套接字请求”
我看到一个信号器/协商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!有任何想法吗?提前致谢.
解决方法
结果:WebSockets现在可以在我们的网站上运行!
Ajax对Web套接字与Web Workers
AJAX比websockets更成熟 – 它已经有了更长的时间,并且有更广泛的浏览器支持。 AJAX是面向请求的 – 您向服务器发出请求,服务器响应,并且连接已关闭。另一方面,Websockets建立与服务器的持久连接,您可以通过它连接两个方向的多个消息。
如果要在不阻止浏览器界面的情况下执行处理器密集型任务,Webworkers将非常有用。
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中的接受答案
谢谢
解决方法
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通讯
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通讯的相关知识,请在本站进行查询。
本文标签: