如何控制不同页面上的html / php会话超时

问题描述

已更新,请参阅有关PHP.ini中Symfony会话配置的部分

我有一个网站,其中包含使用PHP和Symphony v2.8框架创建的多个页面。对于我网站上的大多数页面,默认的HTML / PHP会话超时都可以,但是我有几个网页,当用户在这些网页上时,我想无限期地保持HTML / PHP会话“有效”。 / p>

我不是唯一询问此问题的人,请参见How to extend session cookie lifetime in Symfony?,该问题实际上没有答案可以延长所选网页的会话“寿命”,仅显示了如何设置使用相同config.yml页的网站中所有网页的会话期满,这绝对不是我想要做的。

我可能对会话感到困惑,但是根据我的理解,似乎有两个会话,一个用于用户在浏览器中看到的HTML网页,另一个用于控制变量将其赋值保持多长时间的PHP。

>

无论哪种方式,我都有一个登录网页,在成功登录后,将生成一个登录到期限制值,然后将其传递给用户在我的网站内导航到的页面。当用户导航到我的网站中的其他页面或这些网页之一执行AJAX调用时,服务器将检查请求是否在网页的登录到期限制值之前发生。如果是这样,则该请求被接受,并且新内容被返回到浏览器。如果不是,则将用户重定向到一个告诉他们已注销的网页,并提供指向原始登录网页的链接,用户可以在该网页上再次登录以继续使用我的网站。

此登录和登录有效期限制实际上是一种人为机制,可以在将新网页提供给用户的浏览器时结束并重新启动HTML / PHP会话,效果很好。如果用户等待了足够长的时间,则实际的PHP会话将终止,服务器将重新显示初始主页,用户可以在其中选择重新登录,但前一个会话中设置的PHP变量值会丢失到新会话中。这对我来说是个问题,因为用户原始主页请求中的原始URI查询参数用于配置网站的整体外观,这些外观丢失了,服务器将默认网页发送给浏览器。

对于我的大多数网页,除了丢失PHP变量值外,这正是我想要的,但是在一些像信息亭一样的网页上,我希望HTML / PHP会话不超时,而仅仅是依靠定期刷新的AJAX调用来刷新这些网页上的内容并使它们保持活动状态。这对于扩展我的人工登录限制非常有效,但是这些AJAX调用并不能阻止HTML / PHP会话过期,最终当用户尝试从这些页面导航或服务器发生错误时(服务器-旁变量已失去其价值。

如何通过每次会话接收到的AJAX调用以编程方式延长HTML / PHP会话的“寿命”,或者将其设置为在首次投放这些页面时无限期保持“有效”状态?

PHP.ini中的Symfony会话配置

我在PHP.ini会话部分中包括一些条目,这些条目配置在我的Symfony / PHP中如何实现会话。

[Session]
⫶
; Initialize session on request startup and recommended by Symfony v2.8.

session.auto_start = 0

; Lifetime in seconds of cookie or,if 0,until browser is restarted.

session.cookie_lifetime = 0
⫶
; Defines the probability that the 'garbage collection' process is started
; on every session initialization. ...

session.gc_probability = 1

; Defines the probability that the 'garbage collection' process is started on
; every session initialization. ...

session.gc_divisor = 1000

; After this number of seconds,stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.

session.gc_maxlifetime = 1440
⫶
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.

session.cache_limiter = nocache

; Document expires after n minutes.

session.cache_expire = 180
⫶

此处是Symfony v2.8的官方文章,介绍如何与Symfony会话进行交互,Session Management,但未讨论扩展会话。 PHP.ini会话部分中的 session.cookie_lifetime = 0 设置分配可控制“ Cookie的生存时间(以秒为单位,如果为0,直到重新启动浏览器)”。但是,这实际上并没有按照说明的那样工作,因为过了一段时间(至少一个小时或更长时间),如果用户导航到我网站中的另一个网页,而远离使用AJAX调用来更新用户网页的一个网页登录有效期限制,以防止用户自动注销,用户 IS 注销并重定向到我的网站主页,但是变量控制网站的外观它们的值和主页显示为默认值。

请注意,在这种情况下,被注销的用户不是问题,但是丢失变量是问题。

将这些值保存在浏览器的本地存储中似乎不是一个好主意,因为服务器必须将页面发送到用户的浏览器,并获取新的网页并将其发送回服务器,以便这些值可以用于创建其他网页。

将这些值存储在数据库中也是一个问题,因为服务器丢失了变量,这些变量将允许Web应用程序查找数据库记录。请注意,网页已经在页面请求中发送了这些登录ID和登录到期限制值,但是这些值丢失后就不能用于访问服务器端变量。此外,还有一个问题是,如果用户不注销并仅访问我自己外部的网站,而又不返回,则存储在数据库中的任何内容都只会使数据库混乱。我需要实现其他垃圾回收来防止这种情况。除非确实没有更好的方法来执行我要尝试执行的操作以在用户会话中维护服务器端变量,否则这不是最佳选择。

谢谢。

解决方法

您可以将子域用于想要延长会话时间的那些特定页面。对于这些子域,您可以增加超时,以使主域会话超时保持不变。

例如,假设您的域是abc.com,其超时时间为30分钟。 您需要有一个子域名(如mno.abc.com),并且超时时间为60分钟。 当用户单击mno.abc.com上的特定链接时,他们将有60分钟的会话超时。 您可以在abc.com和mno.abc.com之间共享会话信息。有关更多信息,请参见Sharing SESSION Variables Between Multiple Subdomains

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...