我有一个上传表单,用户需要大约30分钟。去完成。他们在这个页面上闲置的整个时间。我使用ini_set()函数。您可以在此处查看上传页面的顶部:
<?php
session_start();
ini_set('session.gc_maxlifetime',10080);
?>
如果用户闲置30分钟或更长时间,会发生什么。数据被截断,User_id被记录为NULL值。我完全不知道这是怎么回事。我最初在php.ini中设置了maxlifetime,但是重载了缓存的会话数据。所以,我只是使用ini_set。为什么数据会搞砸,而user_id不会被记录下来。注意:如果您足够快地填写表单,则没有问题。
答案 0 :(得分:3)
您应该在ini_set()
之前使用session_start()
。
答案 1 :(得分:2)
那是因为还有另一个调用session.gc_maxlifetime
值为30分钟的脚本。所以其他脚本的会话垃圾收集器会清除不合时宜的会话(从他们的角度来看,会话超时)。
解决方案:您需要在session.gc_maxlifetime
或php.ini
中更改.htaccess
的全局值,或在每个脚本。
答案 2 :(得分:1)
使用session.gc_maxlifetime
设置ini_set
并不一定会影响服务器清除会话的方式。
例如,在 Debian (并且,我想象在其他一些系统上),会话被cron作业清除,该作业不受脚本内部任何配置的影响(它只读取全局php.ini设置)。
如果是这种情况,您可以在php.ini中增加此服务器范围。
您可以覆盖session save handler,然后自行处理会话过期...
你可以使用一些ajax keepalive调用,这样即使用户在该表单页面上空闲,也会在到期时间内与服务器“交谈”,以保持会话活着