如何在不重置用户会话的情况下重新启动Apache?


8

用户已登录PHP网站>我重新启动Apache>用户需要再次登录。

如何预防呢?(我不希望用户再次登录)


检查:您有能力编辑PHP,对吗?
彼得·泰勒

如果是您自己的应用程序,我将建议以下@Jacob Hume提出的建议,并更改您的应用程序以将会话存储在数据库表中。我认为这可以让您更好地控制自己的网站,因为如果有选择地需要,则可以强制用户注销。
Anagio

我可以编辑PHP。我正在使用CMS(Drupal)。我也在使用APC,并正在以这种方式寻找解决方案。
dowik 2012年

Answers:


6

将会话令牌存储在备用位置作为备份可以避免此问题。您仍然可以将主要信息保留在中$_SESSION,但将备用令牌保留在:

  • 饼干
  • 数据库记录
  • HTML5本地存储

您可能会在以下StackOverflow问题中找到一些帮助:会话超时和php中永久登录的最佳实践


感谢您的回答,并感谢链接。我一直在寻找服务器端配置文件上的解决方案(有点“保持重启后的会话”)。但似乎解决方案在应用程序方面。
dowik 2012年

哦,我的...实际上,我只是在寻找“ apache2ctl -k graceful”!
dowik 2012年

3

除非会话数据存储在内存中并且没有备份到磁盘(通过文件系统或数据库),否则会话数据不应仅由于Apache关闭或重新启动而丢失。否则,您可以重新启动整个服务器,并且该会话仍将持续。会话数据旨在长期存储。会话丢失的唯一时间是:

  1. SID丢失。会话数据仍然存在于服务器端,但是客户端无法恢复SID,因此无法重新启动同一会话。如果SID cookie过期(如果是cookie),或者会话链接丢失(如果SID是URL参数),或者未在服务器端设置或未通知客户端就更改了SID,则可能发生这种情况。

  2. 会话数据在服务器端被删除。当PHP会话垃圾收集器运行并且看到会话文件比session.gc_maxlifetime(默认为24分钟)更旧时,通常会发生这种情况。否则,如果应用程序显式删除session,则会发生这种情况。在某些服务器上,管理员可能还配置了cronjob以定期清除旧的会话数据。


谢谢你的细节。我将以这种方式进行调查。但是现在,我将只使用似乎适合我需要的正常重启。
dowik 2012年

@dowik:正常重启如何满足您的需求?您的问题是会话丢失还是下载中断?如果是后者,那么正常重启/关闭确实可以解决问题。但是,然后您应该编辑问题以反映这一点。由于正常重启与PHP会话无关,因此对试图防止会话丢失的其他用户无济于事。
冒犯君主

我已经尝试通过将“ PHP会话”替换为“用户会话”来更新问题的标题,如问题正文中所述。对你更好?更准确地说:我使用APC。当我更改PHP文件中的代码时,我需要刷新APC缓存(重启Apache是​​我所知道的最简单的方法)。使用“重新启动”参数,我的网站的用户需要再次登录。尽管具有“优美”,但它们却没有。这就是为什么“这似乎符合我的需要”。
dowik 2012年

@dowik:我认为这与正常重启没有任何关系。您很可能刚刚进行了一次与PHP会话垃圾回收器同时进行的重启。再次登录,然后立即尝试常规重启。除非将会话存储在内存(MM)中,否则会话将被保存。
冒犯君主

1

通过在Apache中使用正确的参数使之成为可能:

apache2ctl -k graceful

Apache将重新启动而不会丢失当前会话。


2
正常重启只会推迟关机,直到当前连接终止。它不会改变重启行为。
冒犯君主
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.