【问题标题】:PHP Session Storage / Update IssuePHP 会话存储/更新问题
【发布时间】:2022-07-01 16:33:48
【问题描述】:

在因重复问题被标记之前,我知道thisthis 问题。

我的问题是一样的:我有一个聊天轮询脚本,它每 x 秒向服务器发出一个请求,并且在没有来自服务器的更新内容的 n 个请求之后,间隔时间延长 x。一旦服务器返回包含更新内容的响应,间隔时间就会重置为 x。

仅针对此脚本,在看似随机数量的 m 轮询请求之后,请求失败,我收到 500 内部服务器错误,说:

PHP Notice:  session_start() [function.session-start.php]: ps_files_cleanup_dir: opendir(/var/cache/php-sessions) failed: Permission denied (13)

然后,根据提供的问题和其他论坛,我在我的服务器根目录中创建了一个php-sessions 文件夹,访问权限为700,并将session_save_path 设置为相应的目录。会话现在有效地存储在该目录中。

但是,我现在不再收到上述错误,而是400 客户端错误,也是在随机数量的m 轮询请求之后,服务器回复0

我的托管服务告诉我在 PHP 论坛中寻求帮助,但在我看来这没有任何意义,因为请求甚至没有到达服务器,因此这里的 PHP 链接是什么?

我只是想看看是否有人遇到同样的问题,以及如何解决这个问题?

更新

不确定这是否有帮助,但我已经与我的主人确认过,他们说如下:

  • 他们有一个 cronjob,可以从 /var/cache/php-sessions 文件夹中删除超过 24 小时的会话。

  • 他们还使用 php 的原生垃圾收集器 session.gc_probability = 1

可能是这两者以某种方式相互竞争,从而导致错误?

【问题讨论】:

  • (1) 根据我的经验,无需更改对服务器的查询之间的持续时间(每 x 秒)(2) 对于所有客户端的正常聊天,通常 5 秒已经可以了 (3 ) 通常,如果每个用户在 5 秒内仅访问一次,服务器可以处理访问同一数据库的多个客户端以查询最新的聊天数据 --- 除非您的托管计划有流量限制。 (4) 为了尽量减少进出服务器的流量,如果聊天数据中有 CHANGE,则查询应该只获取最新的聊天,所以首先获取 no。的记录,如果没有变化,就不要再获取聊天记录了
  • 我认为您需要授予 apache 访问权限才能写入 /var/lib/php/session
  • @KenLee (4) 几乎是我的做法,是的,完全同意 (1) - (3)。流量限制不是原因,因为该站点甚至尚未部署,并且提到的错误发生在单个用户登录时,因此单个用户轮询。
  • @executable 但问题似乎与访问无关,我设置的目录具有您需要的所有访问权限。好吧,我想我什至不能做你所说的,因为 /var 目录位于我无权访问的目录(共享主机)中。但从理论上讲,也许我需要明确允许访问 apache,甚至是创建的 php-sessions 文件夹?我该怎么做?
  • “因为请求甚至没有到达服务器” - 谁说没有?您是否对 400 状态码感到困惑?这仍然是一个服务器响应,即使它说“客户端错误”(它只是意味着错误是引起的而不是客户端的行为方式,而不是任何错误在服务器端。)

标签: php session permissions session-cookies


【解决方案1】:

在尝试将 PHP 的原生 $_SESSIONs 与我的一些项目设置相结合时,我遇到了各种不同的问题。主要问题是我尝试尝试将 PHP 会话(有状态)与 REST 等无状态方法结合起来。我最终得出结论,在这种情况下,最好使用redis 等高性能数据库解决方案实现您自己的会话处理,或者通过adapting PHP's native session handling 简单地设置您自己的逻辑。

【讨论】: