Session 离开后保存用户会话浏览历史记录(特定超时)

Session 离开后保存用户会话浏览历史记录(特定超时),session,asynchronous,yii,php-5.3,browser-history,Session,Asynchronous,Yii,Php 5.3,Browser History,我正在寻找一种方法,可以方便地保存访问过我的网站的用户在离开该网站后的浏览历史记录。在保存此文件时,我希望将在用户会话期间访问的页面链接在一起。这样我可以得到不同页面之间的相关性 我希望在会话结束时保存数据的原因是性能。我不想在每次页面加载时都在表中写入数据(可能会有很重的索引)的开销。另外,在会话结束时(或离开站点后)保存也有一个优点,即搜索引擎爬行器(没有状态/会话)可以很容易地被过滤掉(它们在会话历史记录中的页面总是不超过一个) 旁注:我的网站使用PHP5.3中的Yii框架 我想到了几个解

我正在寻找一种方法,可以方便地保存访问过我的网站的用户在离开该网站后的浏览历史记录。在保存此文件时,我希望将在用户会话期间访问的页面链接在一起。这样我可以得到不同页面之间的相关性

我希望在会话结束时保存数据的原因是性能。我不想在每次页面加载时都在表中写入数据(可能会有很重的索引)的开销。另外,在会话结束时(或离开站点后)保存也有一个优点,即搜索引擎爬行器(没有状态/会话)可以很容易地被过滤掉(它们在会话历史记录中的页面总是不超过一个)

旁注:我的网站使用PHP5.3中的Yii框架

我想到了几个解决我问题的方法:

  • 当用户离开站点时,在
    onbeforeuload
    中发出ajax请求

    我通过在
    函数的每个
    onclick
    事件中设置一个变量来检查用户是否停留在站点上。另外,当新用户进入网站时,这个方法可能会被触发,这会给他额外的加载时间,让他一次处理多个会话历史记录(我希望避免这种情况)

  • 使用计划任务/cron yob

    这两者都有好处,但有使用大量CPU资源的风险。我还怀疑这需要很多额外的处理。对于这个解决方案,我仍然希望使用Yii框架和(如果可能的话)相同的应用程序上下文来执行cronyob

  • 如果有任何信息可以帮助我在上述解决方案之间做出选择,我将不胜感激。也许我忽略了一个解决方案或可能性?我真的希望在PHP中以设置的超时触发事件,而不是像使用
    sleep()
    那样让用户等待。总之,我相信PHP中的异步执行(从一个同步请求启动)就是我想要的。有什么建议吗

  • 绝对不是。您将遇到浏览器兼容性问题。通过某些浏览操作(如关闭选项卡与关闭应用程序、后退/前进按钮)无点火(缺火)。不,只是不。更不用说安全问题了。。。。永远不要相信客户

  • 总的来说,我真的不认为这是明智的。你将经历混乱,只是为了让你的会议井然有序,特别是在连接会议时。也许这是一个有趣的深入研究yii内脏的过程,但就我个人而言,我觉得这并不合适

  • 在我看来,这最终是唯一的解决办法。我看不出你认为这将是一个巨大的cpu负载。您可以使用YII命令行()来运行YII,该命令行应该能够承载您的web内容

    只需设置一个cron作业,定期通过活动会话并将它们写入数据库


  • 这只是我的2c,而不是所有这些东西,我只是将用户访问的每个页面存储在会话中

    当会话到期时(如何捕获此事件?我不知道,我想这可能是可行的),您将访问的页面存储在DB中。您还可以将它们写入临时文件,如果担心服务器上的负载过大,那么cron作业会在夜间处理临时文件


    我同意阿伦对HTML/ajax的反应,这太疯狂和不可靠了。我想您可以在服务器端做得更好。

    谢谢!我想我只是想听听这个。知道如何在不需要自定义会话处理程序的情况下访问cron yob中的活动会话数据吗?我想我找到了解决问题的方法。克朗·尤布是一条路要走。可以使用加载会话数据。为了避免加载每个会话,每次cron yob运行时,我都会将每个会话的最后一个活动的时间戳保存在
    MYISAM
    表中。使用此表的
    INSERT DELAYED
    语句不会直接花费我任何页面加载时间。或者,您可以通过在会话中设置一个值将会话标记为过时,然后cron作业只会查找所有过时的会话,并一次性将其持久化。是的,但是我仍然不知道我的cron yob中的sessionid(尽管我需要所有的)。