Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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_Session_Session State - Fatal编程技术网

PHP-如何检测中断的会话结束日期时间?

PHP-如何检测中断的会话结束日期时间?,php,session,session-state,Php,Session,Session State,Usercase:我需要跟踪用户在站点上的持续时间。计算公式为(结束日期时间-开始日期时间)。如果用户单击“注销”,则此操作可以正常工作。然后系统可以记录结束日期时间。但我在边缘案例中遇到了问题: 用户会话因以下原因而结束-用户端的internet连接中断、浏览器关闭、系统关闭等。在这些情况下,系统如何知道结束日期时间,以便我可以计算持续时间。需要计算尽可能接近实时日期时间的结束日期时间。如果这是不可能的,那么高达5分钟的准确时间是可以的 我看到的一种可能的方法是保持ping客户端系统并检查是否

Usercase:我需要跟踪用户在站点上的持续时间。计算公式为(结束日期时间-开始日期时间)。如果用户单击“注销”,则此操作可以正常工作。然后系统可以记录结束日期时间。但我在边缘案例中遇到了问题: 用户会话因以下原因而结束-用户端的internet连接中断、浏览器关闭、系统关闭等。在这些情况下,系统如何知道结束日期时间,以便我可以计算持续时间。需要计算尽可能接近实时日期时间的结束日期时间。如果这是不可能的,那么高达5分钟的准确时间是可以的


我看到的一种可能的方法是保持ping客户端系统并检查是否处于活动状态。但我不想这样做,因为它增加了不必要的带宽。那么,还有其他方法可以获取边缘案例的信息吗?

为什么不检查最后一次页面查看的时间呢


检查浏览器窗口的打开时间对像我这样喜欢打开选项卡的人来说没有多大作用。。。更不用说它将很难涵盖所有的边缘情况(不支持JS的浏览器、代理背后的人等等)。最后一个页面视图应该精确到几分钟,并且它将具有最小的开销/复杂度,同时仍保持相当高的准确度…

为什么不检查最后一个页面视图的时间


检查浏览器窗口的打开时间对像我这样喜欢打开选项卡的人来说没有多大作用。。。更不用说它将很难涵盖所有的边缘情况(不支持JS的浏览器、代理背后的人等等)。最后一个页面视图应该精确到几分钟,并且它将具有最小的开销/复杂性,同时仍然保持相当高的准确度…

实际上,系统永远无法知道结束时间,因为HTTP基本上是一个无状态协议。PHP会话(以及其他web脚本语言中的类似功能)是一种实现似乎是有状态的东西的黑客,但这种黑客无法完全克服HTTP的无状态本质。例如,正如您所发现的,如果用户没有经历“注销”过程,服务器就无法知道用户已注销

您可以使用AJAX ping用户,但正如您所说,这需要使用带宽。如果用户关闭了javascript支持,它也将无法运行


另一个明智的选择是,每次用户登录到系统中的页面时,都要记录一个时间戳,并查看时间戳更新后的时间。如果超过了合理的限制,比如20分钟,那么你可以假设用户不再在你的网站上。再说一次,这并不是完全理想的,因为用户可能只是出去吸了一口烟什么的,但是由于HTTP是无状态的,所以您可以实现的任何解决方案都不是完全理想的

实际上,系统永远无法知道结束时间,因为HTTP基本上是一个无状态协议。PHP会话(以及其他web脚本语言中的类似功能)是一种实现似乎是有状态的东西的黑客,但这种黑客无法完全克服HTTP的无状态本质。例如,正如您所发现的,如果用户没有经历“注销”过程,服务器就无法知道用户已注销

您可以使用AJAX ping用户,但正如您所说,这需要使用带宽。如果用户关闭了javascript支持,它也将无法运行


另一个明智的选择是,每次用户登录到系统中的页面时,都要记录一个时间戳,并查看时间戳更新后的时间。如果超过了合理的限制,比如20分钟,那么你可以假设用户不再在你的网站上。再说一次,这并不是完全理想的,因为用户可能只是出去吸了一口烟什么的,但是由于HTTP是无状态的,所以您可以实现的任何解决方案都不是完全理想的

跟踪用户会话的最后活动时间-基本上在每个客户端请求上,您都会使用请求时间更新会话记录。如果还存储了登录时间,则始终可以计算会话的长度,无论会话是活动的、非活动的还是用户已注销的。我还在我的会话表上设置了一个“logged_out”标志,如果用户主动注销,就会设置该标志

以下是我的会话表的定义:

CREATE TABLE IF NOT EXISTS `session` (
  `id` int(11) NOT NULL auto_increment,
  `php_session_id` varchar(100) NOT NULL default '',
  `ip_addr` varchar(100) NOT NULL default '',
  `login_time` datetime NOT NULL ,
  `activity_time` datetime NOT NULL ,
  `user_id` int(11) NOT NULL default '0',
  `logged_out` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `session_id` (`php_session_id`,`ip_addr`),
  KEY `user` (`user_id`,`logged_out`)
) ;

跟踪用户会话的最后活动时间-基本上是在每次客户端请求时,您都会使用请求的时间更新会话记录。如果还存储了登录时间,则始终可以计算会话的长度,无论会话是活动的、非活动的还是用户已注销的。我还在我的会话表上设置了一个“logged_out”标志,如果用户主动注销,就会设置该标志

以下是我的会话表的定义:

CREATE TABLE IF NOT EXISTS `session` (
  `id` int(11) NOT NULL auto_increment,
  `php_session_id` varchar(100) NOT NULL default '',
  `ip_addr` varchar(100) NOT NULL default '',
  `login_time` datetime NOT NULL ,
  `activity_time` datetime NOT NULL ,
  `user_id` int(11) NOT NULL default '0',
  `logged_out` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `session_id` (`php_session_id`,`ip_addr`),
  KEY `user` (`user_id`,`logged_out`)
) ;

最简单的方法是在用户每次请求页面时增加数据库中的活动时间字段。或者自定义会话处理程序,它本身就是一团乱。我希望您不要将会话超时添加到活动时间中,尽管页面请求没有帮助,因为像新闻提要这样的页面整天都是打开的。最简单的方法是在每次用户请求页面时增加数据库中的活动时间字段。或者自定义会话处理程序,它本身就是一团乱。我希望您不要将会话超时添加到活动时间中,尽管页面请求没有帮助,因为像新闻提要这样的页面整天都是打开的。所以时间的缩短是不准确的。这个问题就像说你的实时订阅页面。(就像你的facebook主页)人们几乎整天都在那个页面上打开它。所以我的最后一个视图可能是在2小时前,这是不准确的。@seanD:那么,你会在那里调用Ajax来更新会话,不是吗?如果用户切换了标签,你就不知道了(如果用户切换了,你可以尝试获得更准确的时间)。但根据您的需求,您可能会使原始HTTP