Maison > Questions et réponses > le corps du texte
有一张日志表,记录着每个用户的操作日志信息,例如登录或注销,每个操作都有对应的createtime,以及当前的userName
需求如下:
统计每个用户在一天内在线时长(登录到注销这段时间,可能一天登录注销多次)
如果用户电脑直接关机,或者非正常关闭系统,这时日志表不会产生注销日志,所以将用户最后一次的操作日志(可能是增删改查)作为注销时间,进行在线时长的计算
疑问:
我觉得在日志记录的时候需要记录每次会话的sessionId,否则无法进行上面计算?
天蓬老师2017-04-18 10:33:06
Il n'est pas nécessaire d'enregistrer l'ID de session. Voulez-vous utiliser l'ID de session pour enregistrer l'heure de la dernière opération de sortie anormale ?
La dernière donnée connectée par le même utilisateur doit être une opération de déconnexion
1. Déconnexion normale, la donnée suivante doit être une connexion
2. Fermeture anormale après une opération normale (ajouter, supprimer). , modifier, vérifier), la prochaine fois doit être la même C'est une opération de connexion
Donc, la durée d'une connexion est l'heure de connexion actuelle - l'heure de l'enregistrement précédent avant la prochaine connexion
Cependant, si l'utilisateur ne se connecte pas après un arrêt anormal, il doit être traité séparément. Par exemple, si l'ID de session expire sans opération pendant 20 minutes, vérifiez si le dernier enregistrement remonte à plus de 20 minutes. Il y a plus de 20 minutes, cela sera considéré comme une sortie anormale.
黄舟2017-04-18 10:33:06
Quoi qu'il en soit, il doit y avoir une identification de l'utilisateur pour déterminer de quel journal de comportement de l'utilisateur il s'agit,
Lors de la rédaction du journal, écrivez le décalage horaire entre chaque connexion et déconnexion dans le journal et ajoutez-le à la fin ?
PHP中文网2017-04-18 10:33:06
La table peut être conçue comme ça
用户id 登录时间 退出时间
Lors de la connexion, l'heure de connexion est enregistrée dans la session et l'heure de sortie est définie sur : heure de connexion + heure d'expiration.
Lorsque l'utilisateur est actif, en fonction de l'heure de connexion enregistrée dans la session, l'heure de sortie de cet enregistrement est mise à jour : heure actuelle + heure d'expiration.
Lors de la sortie, en fonction de l'heure de connexion enregistrée dans la session, l'heure de sortie de cet enregistrement est mise à jour à : l'heure actuelle.
巴扎黑2017-04-18 10:33:06
Tableau original (supposé) :
record_id uid name opr_type c_time
1 10 cxl land 2016-12-26 08:00:00
2 10 cxl out 2016-12-26 23:00:00
Tableau final généré :
用户名 日期(asc) 当天第一次登陆时间 当天最后一次登出时间 登陆时长(结果非准确值)
cxl 2016-12-26 2016-12-26 08:00:00 2016-12-26 15:00:00 3小时10分
cxl 2016-12-27 2016-12-26 08:30:00 2016-12-26 23:00:00 6小时10分
Processus détaillé :
1. 日期分组
2. 当天第一次登陆时间
2.1 第一种情况:若当天第一条记录操作类型是 登出,那么 当天第一次登陆时间 = 00:00:01
2.2 第二种情况:若当天第一条记录操作类型是 登陆,那么 当天第一次登陆时间 = c_time
3. 当天最后一次登出时间
3.1 第一种情况:若当天最后一条记录操作类型是 登陆,那么 当天最后一次登出时间 = 23:59:59
3.2 第二种情况:若当天最后一条记录操作类型是 登出,那么 当天最后一次登出时间 = c_time
4. 登陆时长
4.1 当天最后一次登出时间 - 当天第一次登陆时间
Donnez-moi quelques idées. Personnellement, je pense que ce n'est pas facile à mettre en œuvre (le traitement logique nécessite PHP, et la pagination est également gênante. Il faut l'afficher en pagination en fonction de la date, mais pas en fonction du nombre d'enregistrements pris. comme limit 1 , 10
Pour la pagination, un seul SQL ne peut pas obtenir la structure de la table finale), nous ne pouvons donc aller qu'ici....
PHP中文网2017-04-18 10:33:06
Puis-je poser une question à tout le monde ? La connexion peut être enregistrée, mais comment enregistrer la déconnexion ? L'utilisateur ne peut pas réellement cliquer sur le bouton de déconnexion. S'il s'agit du Web, l'utilisateur peut simplement fermer le navigateur et le laisser tranquille. Comment savoir quand vous vous êtes déconnecté ? session?