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


How do I prevent PHP Session timeout during long ajax call?

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

PHP 页面包含用户可以填写的所有表单数据。当用户点击提交按钮时,Ajax 调用会发出该数据,Ajax 调用会等到操作完成,然后将结果通知用户。我必须防止站点在此呼叫进行时超时。

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

在我对此进行研究期间,我还没有真正发现使用什么事件来考虑会话超时。一个页面声称仅使用 Ajax 加载图片会延长会话时间,但这对我来说听起来不对,因为这不涉及 PHP - 此外,如果服务器不接受第二个连接,那将不起作用。另一个页面说这与何时写入会话变量数据有关,但这同样与我的经验不符,因为我有很多页面在登录期间写入,但在那之后没有。

所以我的问题是双重的:

  1. 在给定的超时期限内,哪些确切的事件必须发生或不发生,会话才会被视为"超时"?我猜这里涉及两个计时器 - 浏览器中的 cookie 超时和 PHP 中的会话超时,但这些只是猜测,我想听听专家的意见。

  2. 如何在进程仍在进行时使该会话保持活动状态?该过程可能需要一个小时或更长时间。该站点是一个内部站点,无法从网络外部访问,因此安全性不是一个大问题,但我仍然希望常规会话超时在此页面之外工作。


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

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

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

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

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

据我所知,让我们从基础知识开始:

典型的会话可能包含服务器上的会话文件、会话 ID,通常还包括客户端浏览器中保存会话 ID 和时间戳的 Cookie。

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

哪些

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

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

也许我应该关闭原始问题并用这些信息写一个新问题 - 我愿意在这里接受建议。当我写原始帖子时,我只需要一个项目的答案,但我意识到,在我知道后台工作原理之前,我永远不会完全理解这个过程。

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

如果用户在一段时间后变为非活动状态,或者断开与 Intranet 的连接,则会话被销毁的最短时间将是 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_CHANGEME