gpt4 book ai didi

php - PHP中的随机 session 数据丢失

转载 作者:IT王子 更新时间:2023-10-29 00:13:35 25 4
gpt4 key购买 nike

这是过去几周我们一直面临的问题。

1/我们的设置

  • PHP 5.4 + MySQL
  • 2个专用服务器,负载均衡的
  • 使用memcached
  • 在两个服务器之间复制 session
    在这些服务器上运行的
  • 3个应用程序:
  • 一个使用默认php session 设置
  • 的自定义开发的应用程序
  • 另一个定制开发的应用程序,使用不同的 session 设置(cookie名称,路径)
  • 一个Wordpress CMS

  • 2/问题

    该问题发生在我们的第一个应用程序上。

    我们的一些用户报告说,他们有时会在几分钟后断开连接( session 设置为持续3个小时)。它们可能在同一天几次发生,然后几天都没有断开连接,但是问题总是会再次出现。
    到目前为止,受影响的用户比例很小,但是我想先解决此问题,然后再将其“传播”给其他用户。

    这个问题似乎发生在应用程序的不同位置,尽管我们确定了3种情况,其中大多数错误发生在:
  • 有些涉及提交表单(已修改$ _SESSION变量)
  • 其他仅涉及打开弹出页面,而无需修改 session 数据

  • 我们试图重现用户描述的不同场景:有时我们可以,但是大多数时候我们没有任何问题,这使得调试变得很困难。

    其他说明:
  • 问题是最近的,此应用程序已运行多年,没有任何问题。
  • 似乎与我们的服务器负载无关,因为该问题仍然发生在我们的交通流量较低的暑假期间。
  • 一次仅影响一个 session /用户:同时登录的所有其他用户都没有遇到此问题
  • 在所有不同的浏览器(IE,Firefox,Chrome)上都出现了问题

  • 3/技术分析

    断开连接时,用户将被重定向到页面“您的 session 已过期或您无权查看”。加载此页面后,我们会收到一封技术电子邮件,其中包含$ _SESSION变量的转储。

    当 session 以正常方式过期时,我们收到的电子邮件显示$ _SESSION变量为空(正常行为)。
    当发生意外的断开连接时,有趣的是$ _SESSION并不完全为空:在数组所包含的〜20个元素中,只剩下一个(总是一样)。

    因此,这将意味着 session 未过期,但没有足够的数据来“标识”用户,因此显示“无权限”页面。作为确认,当我们发生这种情况时,我们可以 checkin memcached以确保该 session 仍然保存一些数据。

    这些是到目前为止我们已经确定的潜在问题原因,并且我们已经采取了哪些措施将它们排除在外:
  • Memcached表示70%到80%的可用空间,因此我们认为这不是问题。
  • 我们删除了Memcached,然后返回使用NFS共享目录来存储 session 文件:问题实际上变得更加严重。这将指出一个可应用的错误,因为NFS写入数据的速度较慢, session 丢失会更频繁地发生。
  • 我们浏览了所有讨论PHP session 数据丢失的论坛(包括SO),并相应地检查了我们的代码。代码库很大,但是我们使用了自动化的工具和脚本来避免丢失文件。

    在每个页面的开头调用
  • session_start()。
  • 在每个 header (“Location ...”)之后调用
  • exit()
  • register_globals已关闭
  • 我们已经测试了其他两个应用程序与有问题的应用程序之间的可能干扰,尽管它们不共享任何代码,数据库或 session 处理。那里什么都没发现。
  • 我们已经分析了断开连接期间的访问日志,以检查行为模式:这里也没有运气。

  • 所以我们不知道是什么原因导致了这个问题,因为它似乎是随机发生的,所以我的问题是:
  • 问题可能出在我们的代码上:我们错过了要检查的东西吗?这种解决方案似乎不太可能,因为该代码大多数时候对我们所有用户都有效,但我仍在考虑。
  • 问题可能来自另一个应用程序/进程,该应用程序/进程将“清空” session 变量数组的一部分。我们还检查了其他应用程序中的代码,但未发现任何可能导致此问题的代码。
    而且,如果另一个进程正在执行此操作,为什么只清空部分 session 而不是全部清空?

  • 谢谢你的帮助。

    最佳答案

    我认为您不会对问题有确切的答案。可能的原因太多,您还没有显示任何代码。

    不过,我的猜测是您已将memcached.sess_locking关闭,或者如果您具有自定义 session 实现-它根本不会实现锁定。
    最终,这导致两个同时HTTP请求之间的竞争状态。

    我的猜测基于经常看到的坏建议,即关闭锁或尽快释放锁,以获得更高的性能。

    关于php - PHP中的随机 session 数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643033/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com