我有一个内部网站点,它必须执行复杂而冗长的MySQL操作,而且我必须找到一种方法来防止在此过程中发生PHP会话超时。
PHP页面拥有用户可以填写的所有表单数据。当用户点击submit按钮时,Ajax调用将与该数据一起发出,Ajax调用等待操作完成,然后将结果通知用户。我必须阻止网站超时,而这个电话正在进行。
我的第一个想法是使用setInterval,每10秒对一个页面运行第二个ajax调用,该页面只加载会话并刷新其中的一些数据,但在第一个测试中,我注意到第二个调用和任何进一步的调用直到第一个调用完成后才被响应(我在第一个调用中使用了PHP来模拟漫长的等待)。我的脚本启动了几个新的ajax调用(我在Firebug中看到了这些调用),但是它们都等到第一个调用完成-直到那时服务器没有响应。我认为服务器只是忽略来自同一个客户端的第二个调用,直到第一个客户端完成为止。我怀疑Apache会停止接受呼叫,因为PHP正在等待sleep完成..。
在我对这个问题的研究中,我还没有真正了解什么事件被用来考虑会话超时。有一页声称,仅仅使用Ajax加载图片会延长会话时间,但这听起来不太正确,因为这不涉及PHP --此外,如果服务器不接受第二个连接,那就无法工作。另一个页面说,它与每次写入会话变量数据有关,但这也不符合我的经验,因为我有很多页面在登录期间编写,但之后没有。
所以我的问题有两方面:
好吧,我觉得有必要在这里澄清一下。
每当涉及PHP会话超时时,我都试图找出服务器上的幕后发生了什么。
例如:如果我有一个创建PDF文件需要花费1小时的脚本,但超时设置为30分钟,那么会因为用户/浏览器/鼠标没有活动而触发超时,还是不会因为脚本仍在运行而触发超时?
我想知道的是到底发生了什么--在会话超时之前延长会话会发生什么事件(用户和服务器都会创建)?
你可以整天告诉我PHP设置,但我仍然不知道会发生什么。
让我们从我所理解的基本知识开始:
典型的会话可以由服务器上的会话文件、会话id以及客户端浏览器中保存会话id的cookie和时间戳组成。
我假设服务器上的会话文件或会话文件的某些索引也包含时间戳。
哪些事件导致这些时间戳被更新,哪些时间戳被用来确定会话是否超时?我可以看到服务器测试cookie的过期日期,以确定会话是否应该超时,但依赖服务器信息可能更安全。
这是我在这里寻找的信息类型。
也许我应该结束原来的问题,用这个信息写一个新的问题--我对这里的建议持开放态度。当我写这篇文章的时候,我只需要一个答案来回答我的项目,但是我意识到我永远不会完全理解这个过程,除非我知道背景中的工作原理。
发布于 2015-01-12 20:05:48
首先,您必须知道,当用户处于活动状态时(通过经典的Link或ajax浏览您的Intranet,因为apache服务器无法区分)您的会话仍然存在。
如果用户在一段时间后变得不活跃,或者断开您的内联网,那么会话将被销毁的最小时间将是在php.ini中设置的参数的值:
session.gc_maxlifetime= TIME_IN_SECONDS要正确配置会话超时,您必须配置以下3个参数:
; Defines the probability that the 'garbage collection' process is started
; on every session initialization. The probability is calculated by using
; gc_probability/gc_divisor. Where session.gc_probability is the numerator
; and gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.gc-probability
session.gc_probability=PROBA_CHANGEME
; Defines the probability that the 'garbage collection' process is started on every
; session initialization. The probability is calculated by using the following equation:
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
; session.gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request. Increasing this value to 1000 will give you
; a 0.1% chance the gc will run on any give request. For high volume production servers,
; this is a more efficient approach.
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
; http://php.net/session.gc-divisor
session.gc_divisor=DIVISOR_CHANGEME
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime= MAX_LIFE_TIME_CHANGEMEhttps://stackoverflow.com/questions/27909635
复制相似问题