Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将所有用户活动存储为会话值,并在会话结束时保存会话值_Php_Events_Session_Event Handling - Fatal编程技术网

Php 将所有用户活动存储为会话值,并在会话结束时保存会话值

Php 将所有用户活动存储为会话值,并在会话结束时保存会话值,php,events,session,event-handling,Php,Events,Session,Event Handling,通常,我会在php中通过对每个页面加载执行查询来保存所有用户活动、页面视图和所有值 现在我考虑将所有这些存储为会话值和 在会话结束时执行查询。但是,我不知道如何在php中处理这个“会话结束”事件 我考虑过一个后台进程,它在会话超时之前存储所有会话值,但我对php中的多线程方法一无所知,尽管我听说有一些规避方法是可能的 我想确定用户在没有用户的情况下是否处于非活动状态 触发(如页面加载)并在 会话结束,在超时之前 这将节省数据库引擎上的一些工作负载,方式如下: 如果用户浏览了很多页面,我会

通常,我会在php中通过对每个页面加载执行查询来保存所有用户活动、页面视图和所有值

  • 现在我考虑将所有这些存储为会话值和 在会话结束时执行查询。但是,我不知道如何在php中处理这个“会话结束”事件
我考虑过一个后台进程,它在会话超时之前存储所有会话值,但我对php中的多线程方法一无所知,尽管我听说有一些规避方法是可能的

  • 我想确定用户在没有用户的情况下是否处于非活动状态 触发(如页面加载)并在 会话结束,在超时之前
这将节省数据库引擎上的一些工作负载,方式如下: 如果用户浏览了很多页面,我会增加会话中的值,而不是执行类似以下的查询

update pageviews set numberofviews=numberofviews+1
在每个页面上加载

  • 问题是:“如何在php中处理会话结束事件 没有用户活动?”
对实际问题的解决方案也表示赞赏。不管与问题的相关性如何,用粗体表示。 (我还没有开始为此编写代码,我的问题不是关于bug修复。)

可能的解决办法:

  • 将数据存储在mysql表中,mysql表是一种内存类型,正在移动 每隔一段时间将记录保存到另一个表中
我已经发现了,但是文档没有说明回调参数是否可以为null参数

如果为$callback参数输入null参数,是否会丢失标准功能

我只想更改会话$destroy事件。我现在需要你的帮助

相关职位:
有点偏离正轨,但你可以自己做垃圾收集

  • 使用PHP将会话保存在禁用垃圾收集的目录中,最好是tmpfs

  • 编写一个周期性的PHP脚本,查找所有超过20分钟的会话文件,打开它们,将它们写入数据库并删除它们


您不能真正使用会话销毁处理程序,因为只有在显式调用会话销毁处理程序时才会调用该处理程序,如果用户关闭浏览器并结束会话,则不会发生这种情况。由于在该场景中无法捕获会话结束“事件”,因此您必须进行某种定期检查,以查看会话是否在给定的时间段内处于空闲状态。最简单的方法是在会话中创建一个保存上次访问时间的字段,然后创建一个脚本,定期(通过cron或触发PHP脚本中的一些其他功能)检查该字段中的所有活动会话,对于时间戳超过xx秒的会话,运行更新查询

请注意,为了使用存储在文件系统上的标准PHP会话执行此操作,您必须实际打开文件并直接解析它们。另一种方法是将会话存储在数据库中,但考虑到您试图减少数据库的负载,这可能不是您想要做的

另一种不太像开发密集型的可能性是:

  • 将上次访问的时间戳添加到会话中
  • 每次更新会话时检查该时间戳
  • 如果时间戳早于xx秒,则在db上运行更新查询,并将时间戳设置为当前时间

  • 这样,您只需每隔一段时间更新数据库,而不是每次加载页面。当然,这种方法的缺点是,除非会话上的最后一个活动与调用update函数的时间间隔完全对应,否则您可能无法在数据库中存储最新的会话信息。

    这只是一种胡思乱想,您可以在从javascript卸载窗口时发出http请求来保存会话数据。问题是浏览器通常会在页面关闭后停止请求,因此此请求甚至可能不会到达服务器,但我想这值得一试。

    尽管有一些解决方法,但解决此问题的每个解决方案都比记录每个请求中的每个用户活动效率更低

    你想解决什么问题?我不明白你为什么不在每次请求时对数据库进行更新查询。它不应该超过00001秒

    我绝对会去更新每个请求。它只有一行代码,不会在数据库上产生过多的负载,而且效率更高


    您提出的方法很难测试,会产生不必要的负载,甚至可能会创建全局状态。你可以通过使用传统的解决方案来避免这一切。在确定会话何时“结束”时,会话是一个(…)问题

    这不是创建会话的目的,因此仅使用会话机制是不可能实现的

    对于标准PHP会话,您的选项有些有限,并且取决于会话存储:

  • 默认情况下,会话存储在文件中。如果禁用会话垃圾回收,则可以运行cron作业,该作业将解析早于定义时间的会话文件。它并不完美,但迄今为止是最简单的。此外,文件会话也会吸吮-写入每个请求
  • Memcached中的会话。由于没有很好的方法获取比x早的记录,而且Memcached在数据过期时只会删除数据,所以这里做不了多少工作
  • DB中的会话-每个请求都有一个更新
  • 因此,您对标准会话的选择充其量是有限的。我的建议是:用您自己的会话替换标准会话,但这意味着您将不再通过$\u会话访问会话,并且将需要重写大量代码

    我已将常会改为一次会议