【问题标题】:How to call a laravel event or function when socket disconnect event is fired触发套接字断开事件时如何调用laravel事件或函数
【发布时间】:2017-04-28 18:42:17
【问题描述】:

我正在使用 Laravel 5.2,我想要的是从套接字事件断开调用自定义函数来更新我的表 playsessions 中的记录。

流程

  1. 当用户进入频道部分,我通过 AJAX 发送用户的设备信息,例如:ip、devide、浏览器、socket id 等...以便在数据库中创建记录.

  2. 但如果用户断开连接,我想更新发送套接字 id 的记录。

实际上,我做了第一步,但我不知道如何做第二步。

查看 Channel.blade.php

var socket = io.connect('http://localhost:3000');

socket.on('connect', function() {
    var socket_id = socket.io.engine.id;

    $.ajax({
        type: 'POST',
        url: "{{ route('play_session.store') }}",
        data: {
            ip: "{{ $play_session_data['ip'] }}",
            device: "{{ $play_session_data['device'] }}",
            platform: "{{ $play_session_data['platform'] }}",
            browser: "{{ $play_session_data['browser'] }}",
            session_id: "{{ $play_session_data['session_id'] }}",
            user_id: "{{ $play_session_data['user_id'] }}",
            channel_id: "{{ $play_session_data['channel_id'] }}",
            socket_id: socket_id
        },
        success: function() {
            console.log('session created');
        }
    });
});

Socket.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(3000);

io.on('connection', function (socket) {
    console.log("new client connected " + socket.id);

    socket.on('disconnect', function() {
        console.log('client disconnected');

        // I want to call here a event of laravel or function sending the socket.id to update a record in database 
    });
});

或者当用户与 laravel 服务器断开连接时,最好的方法是什么。

更新

我现在在事件断开中使用 AJAX 但不起作用:

查看 Channel.blade.php

var socket = io.connect('http://localhost:3000');

socket.on('connect', function() {
    var socket_id = socket.io.engine.id;

    $.ajax({
        type: 'POST',
        url: "{{ route('play_session.store') }}",
        data: {
            ip: "{{ $play_session_data['ip'] }}",
            device: "{{ $play_session_data['device'] }}",
            platform: "{{ $play_session_data['platform'] }}",
            browser: "{{ $play_session_data['browser'] }}",
            session_id: "{{ $play_session_data['session_id'] }}",
            user_id: "{{ $play_session_data['user_id'] }}",
            channel_id: "{{ $play_session_data['channel_id'] }}",
            socket_id: socket_id
        },
        success: function() {
            console.log('session created');
        }
    });

    socket.on('disconnected', function() {
        $.ajax({
            type: 'POST',
            url: "{{ route('play_session.close') }}",
            data: {
                socket_id: socket_id
            },
            success: function() {
                console.log('session closed');
            }
        });
    });
});

谢谢。

【问题讨论】:

  • 发出另一个 Ajax 请求,在用户断开连接时将 id 发送到服务器。然后在服务器端进行更新。就像您在用户连接时所做的那样。
  • 我在视图通道中使用此方法,但不起作用。可以看到代码更新了。
  • 如果客户端断开连接(可能是由于网络故障),为什么还要依赖 Ajax 请求?难道你不能在服务器端使用“断开连接”事件来做你想做的事吗?
  • 是的,我想在服务器端这样做,但我不知道该怎么做。
  • 而我想做的就是用那一刻的时间戳更新一条记录,并知道用户连接了多长时间。

标签: javascript php node.js laravel socket.io


【解决方案1】:

您可以发送包含所需数据的 AJAX 请求并从那里触发事件。

【讨论】:

  • 我在视图通道中使用此方法,但不起作用。可以看到代码更新了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2011-11-03
  • 2013-05-31
相关资源
最近更新 更多