Apache 记录 HTTP 408 错误,客户端似乎丢失了 PHP 会话

Apache 记录 HTTP 408 错误,客户端似乎丢失了 PHP 会话

我正在努力解决一个奇怪的问题,即“注销”用户,并且似乎每天发生大约十次。

该应用程序是一个旧的 PHP 项目。客户端登录;建立 PHP 会话。有时,如果客户端在 2 小时内没有执行任何操作,然后发送新的 HTTP 请求,Apache 会返回错误HTTP 408

1.2.3.4 - - [17/Apr/2020:12:26:30 +0200] "-" 408 3281 "-" "-"

并且用户被发送到登录页面并必须再次输入他们的登录凭据,丢失他们在表格中填写的数据等。我无法真正重现该问题,在大多数情况下,空闲客户端甚至可以在 5 小时后发送下一个请求并且不会触发 408。它似乎非常随机并且适用于所有浏览器。

如果我手动删除服务器上的 PHP 会话文件,我只能重现 408 错误。同样奇怪的是,如果我这样做,我不会在 Chrome 开发人员工具栏中看到 408,只会在 Apache 日志中看到。

会话超时时间过长(72 小时)。配置了以下参数:

php_value session.gc_maxlifetime 259200
php_value session.gc_divisor 1
php_value session.gc_probability 1
php_value session.cookie_lifetime 0

现在我读了很多关于 的文章KeepAlive,但我认为这不是原因,因为网站上的流量不大。我们谈论的是中间的几小时,而不是几秒钟。

这是一个常见问题吗?有人可以给我指明正确的方向吗?

编辑:

session_unset()在项目中未使用。session_destroy仅在用户注销时被调用。通过删除 中的会话文件/var/lib/php/sessions,用户当然会被注销,因此它会重定向到login.php。我觉得没问题。所以我认为会话文件以某种方式被删除了。

我也在以下位置看到了这一点error.log

[Fri Apr 17 22:42:32.386978 2020] [:error] [pid 15563] [client 1.2.3.4:55104] PHP Notice:  session_start(): ps_files_cleanup_dir: opendir(/var/lib/php/sessions) failed: Permission denied (13) in /var/www/myproject/htdocs/sessionReload.php on line 2, referer: https://myproject/page.php

第 2 行sessionReload.php是:

session_start();

答案1

opendir(/var/lib/php/sessions)失败:/var/www/myproject/htdocs/sessionReload.php 中的权限被拒绝(13)

显然,某个地方存在权限问题。您没有告诉我们有关运行此程序的服务器的任何信息。如果会话正在启动,则此目录必须可由 Web 服务器上的某些内容写入(您可以通过查找此位置的文件/时间戳来检查)。这意味着有多个 uid 正在运行 PHP(或者它可能是一个与 open_basedir 相关的相当深奥的问题,或者它使用 debian php 会话模型,并且收割机与 Web 服务器处于截然不同的时区)。

检查您的 PHP 代码以哪些 uid 运行/如果您使用多个 SAPI。检查目录和任何子目录的权限和所有权。

如果您仍然遇到问题,请返回查看您找到的有关操作系统/PHP 安装方式的详细信息。

答案2

我也遇到了同样的问题。我通过将 Apache 配置为高超时、无限 MaxKeepAliveRequests 和高于超时的 KeepAliveTimeout 来解决了这个问题。

相关内容