java - 根据一张登录登出日志表计算每个用户在线时长,求个思路
阿神
阿神 2017-04-18 10:31:06
0
5
1719

有一张日志表,记录着每个用户的操作日志信息,例如登录或注销,每个操作都有对应的createtime,以及当前的userName

  • 需求如下:

    • 统计每个用户在一天内在线时长(登录到注销这段时间,可能一天登录注销多次)

    • 如果用户电脑直接关机,或者非正常关闭系统,这时日志表不会产生注销日志,所以将用户最后一次的操作日志(可能是增删改查)作为注销时间,进行在线时长的计算

  • 疑问:

    • 我觉得在日志记录的时候需要记录每次会话的sessionId,否则无法进行上面计算?

阿神
阿神

闭关修行中......

membalas semua(5)
Peter_Zhu

Tidak perlu merakam sessionid Adakah anda mahu menggunakan sessionid untuk merekodkan masa operasi terakhir keluar tidak normal?
Sekeping data terakhir yang dilog masuk oleh pengguna yang sama mestilah operasi log keluar
1. Log keluar biasa, sekeping data seterusnya mestilah log masuk
2 , ubah suai, semak), kali seterusnya mestilah sama Ini operasi log masuk

Jadi panjang log masuk ialah masa log masuk semasa - masa rekod sebelumnya sebelum log masuk seterusnya

Namun, jika pengguna tidak log masuk selepas penutupan tidak normal, ia perlu diproses secara berasingan Contohnya, jika sessionid tamat tempoh tanpa operasi selama 20 minit, semak sama ada rekod terakhir adalah lebih daripada 20 minit yang lalu lebih daripada 20 minit yang lalu, ia akan dianggap sebagai jalan keluar yang tidak normal.

黄舟

Apa pun, mesti ada pengenalan pengguna untuk menentukan log tingkah laku pengguna itu,

Apabila menulis log, tulis perbezaan masa antara setiap log masuk dan log keluar ke dalam log, dan tambahkannya pada penghujung?

Ty80

Meja boleh direka seperti ini

用户id   登录时间  退出时间

Apabila log masuk, masa log masuk direkodkan dalam sesi dan masa keluar ditetapkan sebagai: masa log masuk + masa tamat.

Apabila pengguna aktif, berdasarkan masa log masuk yang direkodkan dalam sesi, masa keluar rekod itu dikemas kini: masa semasa + masa tamat masa.

Apabila keluar, mengikut masa log masuk yang direkodkan dalam sesi, masa keluar rekod itu dikemas kini kepada: masa semasa.

巴扎黑

Jadual asal (diandaikan):

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

Jadual hasil akhir:

用户名    日期(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分

Proses terperinci:

1. 日期分组
2. 当天第一次登陆时间
     2.1 第一种情况:若当天第一条记录操作类型是 登出,那么 当天第一次登陆时间 = 00:00:01
     2.2 第二种情况:若当天第一条记录操作类型是 登陆,那么 当天第一次登陆时间 = c_time
    
3. 当天最后一次登出时间
    3.1 第一种情况:若当天最后一条记录操作类型是 登陆,那么 当天最后一次登出时间 = 23:59:59
    3.2 第二种情况:若当天最后一条记录操作类型是 登出,那么 当天最后一次登出时间 = c_time
4. 登陆时长 
    4.1 当天最后一次登出时间 - 当天第一次登陆时间

Beri saya beberapa idea Saya secara peribadi berpendapat ia tidak mudah untuk melaksanakannya (pemprosesan logik memerlukan PHP, dan paging juga menyusahkan. Ia perlu dipaparkan dalam paging mengikut tarikh, tetapi tidak mengikut bilangan rekod yang diambil. seperti limit 1 , 10 Untuk paging, SQL tunggal tidak boleh mendapatkan struktur jadual akhir), jadi kita hanya boleh pergi ke sini....

洪涛

Bolehkah saya bertanya kepada semua orang? Log masuk boleh dirakam, tetapi bagaimana untuk merekod keluar? Pengguna mungkin tidak mengklik butang log keluar. Jika ia adalah web, pengguna hanya boleh menutup penyemak imbas dan membiarkannya begitu sahaja. Bagaimana anda tahu apabila anda log keluar? sesi?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!