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

时间:2015-01-12 19:49:11

标签: php session session-timeout

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

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

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

在我对此进行研究期间,我还没有真正发现用于考虑会话超时的事件。一页声称仅使用Ajax加载图片会延长会话时间,但这听起来并不合适,因为这并不涉及PHP - 此外,如果服务器不接受第二次联系,不会起作用。另一个页面说它与编写Session变量数据时有关,但是这也与我的经验相匹配,因为我有大量的页面在登录期间写入而不是在之后写入。

所以我的问题是双重的:

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

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


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

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

    例如:如果我有一个脚本需要1小时才能创建PDF文件,但超时设置为30分钟,将触发超时,因为用户/浏览器/鼠标未激活,或超时不是触发因为脚本仍在运行?

    我想知道的是究竟发生了什么 - 在超时之前发生了什么事件(用户和服务器创建)?

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

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

    典型的会话可能包含服务器上的会话文件,会话ID,以及客户端浏览器中通常包含会话ID和时间戳的cookie。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

首先,您必须知道,当用户处于活动状态时(通过经典链接或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