【发布时间】:2017-04-28 18:42:17
【问题描述】:
我正在使用 Laravel 5.2,我想要的是从套接字事件断开调用自定义函数来更新我的表 playsessions 中的记录。
流程:
当用户进入频道部分,我通过 AJAX 发送用户的设备信息,例如:ip、devide、浏览器、socket id 等...以便在数据库中创建记录.
但如果用户断开连接,我想更新发送套接字 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