我有一台 LAMP 服务器。用户登录并针对 MySQL 数据库进行身份验证。身份验证成功后,session_start()
会调用。在任何时候都不会regenerate_session_id()
调用。我遇到创建多个空的 PHP/apache 会话的情况。大约每秒都会创建一个空白会话文件。php.ini
我有:
session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 1440
我意识到这与会话创建无关,而是与 GC 的设置有关。我们将其设置为全速,以便它可以处理所有过期的会话,并希望清理所有空会话。我不知道是否预计会出现空白会话,或者这是否真的是一个问题。我担心的是,如果有这么多,它会增加会话劫持成功的可能性。有一台用于测试和开发的重复机器,它没有这种行为。我的印象是,只有在用户通过身份验证并调用时,httpd 才会创建会话文件session_start()
。我不知道是什么导致了空白会话文件,这是否是一个真正的问题,或者是否有其他人遇到过这种行为。
制定auditctl
规则来监视该目录,肯定是 apache 创建了它们。这可以证明 apache 是所有空文件的所有者:组。此框当前正在运行 apache 2.2.15。find . -type f | wc -l
显示文件数稳步增加。几分钟后我发现文件数超过 640,而且我确信即使使用 GC 处理,情况也会变得更糟。
答案1
这应该是一个评论——但它有点长。
您没有告诉我们为什么这是意外的,也没有提供任何背景信息。
- 您是否尝试将会话创建与访问日志关联起来?
- 您是否希望在会话中始终找到一些数据?
- 您是否检查过您的代码以确定哪些脚本调用了 session_start() 但没有设置值?
- 您是否尝试过检测代码以始终捕获一些数据?
- 您是否已测试过网站中的所有代码,以确保会话按预期工作并且错误日志记录正常工作?
- 您是否检查过错误日志中是否存在“标题已发送”
您自己肯定已经做了一些努力去调查了?但您只提到使用 uditctl 来查看出现的文件 - 显然这对于找出触发这些文件的原因没有多大帮助。
您向我们展示的配置与创建会话。您可以考虑先阅读一些有关 PHP 会话如何工作的内容。
提示:如果你添加%{Set-Cookie}o
到你的访问日志格式,那么您将能够看到哪些请求正在创建哪些会话。如果您添加自动添加文件,那么您不必编辑每个文件,但可以添加工具来将数据发送到日志和/或会话本身。如何实现这一点取决于您是否在每个脚本/特定目录树中使用 session_start()。
如果是我,我会修改日志格式并安装自定义会话处理程序,以便通过自动添加捕获更多信息,但不会更改现有代码库(如果脚本中未调用 session_start(),则开销可以忽略不计)。我还将检查错误日志的配置并检查代码中的实例,以error_reporting()
确保报告问题。