我正在寻找一种方法,在离开我的网站后,轻松保存访问过我网站的用户的浏览历史记录。在保存时,我想将用户会话期间访问过的页面链接在一起。这样我就可以得到不同页面之间的相关性。
我希望在会话结束时保存数据的原因是性能。我不想每次页面加载都在表中写入(可能有大量索引(。在会话结束时保存(或离开网站后(还有一个优点,即搜索引擎蜘蛛可以很容易地过滤掉。
旁注:我的网站使用的是PHP 5.3中的Yii框架。
我为我的问题想出了几个解决方案:
-
当用户离开站点时,在
onbeforeunload
中发出ajax请求。我通过在具有链接到内部页面的
href
属性的<a>
上的每个onclick
事件中设置一个变量来检查用户是否留在站点上。遗憾的是,javascript方法并非万无一失,因为浏览器的后退和前进按钮(不设置此变量(。还有一个额外的好处,即会话数据通常在"最后(ajax(请求"期间可用。 -
编写我自己的会话处理程序
这将是更麻烦的解决方案。我还没有在Yii中使用自定义会话处理程序,我有点不确定(例如(是否可以在覆盖的gcSession((函数中删除过期的会话数据之前轻松加载和处理它。此外,当一个新用户进入网站时,这种方法可能会被触发,这给他留下了额外的加载时间来同时处理多个会话历史记录(我喜欢防止(。
-
使用计划任务/cron yob
这两者都有好处,但也有使用大量CPU资源的风险。我还怀疑这将需要大量的额外处理。对于这个解决方案,我仍然希望使用Yii框架和(如果可能的话(相同的应用程序上下文来执行cron-yob。
如果有任何信息可以帮助我在上述解决方案之间做出选择,我将不胜感激。也许我忽略了一个解决方案或可能性?我真的很想在PHP中的设置超时时触发一个事件,而不是像sleep()
那样让用户等待。总而言之,我相信PHP中的异步执行(从单个同步请求启动(是我想要的。有什么建议吗?
-
绝对不是。您将遇到浏览器兼容性问题。某些浏览操作(如关闭选项卡与关闭应用程序、后退/前进按钮(不会引发火灾。不,只是不。更不用说安全问题了。。。。永远不要信任客户端
-
总的来说,我真的不认为这是明智的。你会经历混乱,只是为了让你的会议有条理,尤其是在连接会议时。深入探究yii的内在可能很有趣,但就我个人而言,我觉得这并不合适。
-
最终,这是我眼中唯一的解决方案。我看不出你认为这会是一个很大的cpu负载。您可以使用YII命令行(Docs(通过YII运行此操作,该命令行应该能够承载您的web内容。
只需设置一个cron作业来定期处理活动会话,并将它们写入DB。
这只是我的2c
我只会在会话中存储用户访问的每个页面,而不是所有这些东西。
当会话到期时(如何捕获此事件?我不知道,我想这可能是可行的(,您将访问的页面存储在DB中。您还可以将它们写入一个临时文件,如果您担心服务器负载过大,那么cron作业会在夜间对其进行处理。
我赞同阿恩对HTML/ajax内容的反应,这太疯狂和不可靠了。我认为你可以在服务器端做得更好。