首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在长时间ajax调用期间防止PHP会话超时?

如何在长时间ajax调用期间防止PHP会话超时?
EN

Stack Overflow用户
提问于 2015-01-12 19:49:11
回答 1查看 1.9K关注 0票数 0

我有一个内部网站点,它必须执行复杂而冗长的MySQL操作,而且我必须找到一种方法来防止在此过程中发生PHP会话超时。

PHP页面拥有用户可以填写的所有表单数据。当用户点击submit按钮时,Ajax调用将与该数据一起发出,Ajax调用等待操作完成,然后将结果通知用户。我必须阻止网站超时,而这个电话正在进行。

我的第一个想法是使用setInterval,每10秒对一个页面运行第二个ajax调用,该页面只加载会话并刷新其中的一些数据,但在第一个测试中,我注意到第二个调用和任何进一步的调用直到第一个调用完成后才被响应(我在第一个调用中使用了PHP来模拟漫长的等待)。我的脚本启动了几个新的ajax调用(我在Firebug中看到了这些调用),但是它们都等到第一个调用完成-直到那时服务器没有响应。我认为服务器只是忽略来自同一个客户端的第二个调用,直到第一个客户端完成为止。我怀疑Apache会停止接受呼叫,因为PHP正在等待sleep完成..。

在我对这个问题的研究中,我还没有真正了解什么事件被用来考虑会话超时。有一页声称,仅仅使用Ajax加载图片会延长会话时间,但这听起来不太正确,因为这不涉及PHP --此外,如果服务器不接受第二个连接,那就无法工作。另一个页面说,它与每次写入会话变量数据有关,但这也不符合我的经验,因为我有很多页面在登录期间编写,但之后没有。

所以我的问题有两方面:

  1. 在给定的超时期间内,哪些确切的事件必须发生或不发生,以便会话被视为“超时”?我猜这里有两个计时器-浏览器中的cookie超时和PHP中的会话超时,但这些只是猜测,我想听听专家们的意见。
  2. 在这个过程还在进行的时候,我怎样才能让这个会话保持活力呢?这个过程可能需要一个小时或更长时间。该站点是一个内部网站点,无法从网络外部访问,因此安全性并不是很大的问题,但我仍然希望常规会话超时在此页面之外工作。

好吧,我觉得有必要在这里澄清一下。

每当涉及PHP会话超时时,我都试图找出服务器上的幕后发生了什么。

例如:如果我有一个创建PDF文件需要花费1小时的脚本,但超时设置为30分钟,那么会因为用户/浏览器/鼠标没有活动而触发超时,还是不会因为脚本仍在运行而触发超时?

我想知道的是到底发生了什么--在会话超时之前延长会话会发生什么事件(用户和服务器都会创建)?

你可以整天告诉我PHP设置,但我仍然不知道会发生什么。

让我们从我所理解的基本知识开始:

典型的会话可以由服务器上的会话文件、会话id以及客户端浏览器中保存会话id的cookie和时间戳组成。

我假设服务器上的会话文件或会话文件的某些索引也包含时间戳。

哪些事件导致这些时间戳被更新,哪些时间戳被用来确定会话是否超时?我可以看到服务器测试cookie的过期日期,以确定会话是否应该超时,但依赖服务器信息可能更安全。

这是我在这里寻找的信息类型。

也许我应该结束原来的问题,用这个信息写一个新的问题--我对这里的建议持开放态度。当我写这篇文章的时候,我只需要一个答案来回答我的项目,但是我意识到我永远不会完全理解这个过程,除非我知道背景中的工作原理。

EN

回答 1

Stack Overflow用户

发布于 2015-01-12 20:05:48

首先,您必须知道,当用户处于活动状态时(通过经典的Link或ajax浏览您的Intranet,因为apache服务器无法区分)您的会话仍然存在。

如果用户在一段时间后变得不活跃,或者断开您的内联网,那么会话将被销毁的最小时间将是在php.ini中设置的参数的值:

代码语言:javascript
复制
session.gc_maxlifetime= TIME_IN_SECONDS

要正确配置会话超时,您必须配置以下3个参数:

代码语言:javascript
复制
; 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_CHANGEME
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27909635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档