当2个用户(几乎)同时访问同一个页面时,我遇到了竞争情况。这会导致用户访问另一个用户的数据。
几个月来,我一直在努力抓住这个问题,终于成功了。我使用的是Yii Framework 1. 1,用户登录过程如下:
- 会话存储在数据库中,我实际上不使用$_SESSION来存储任何内容。
- 生成的会话ID存储在cookie中,并填充$_COOKIE,PHP使用$_COOKIE将用户连接到他们的数据。
- 在登录页面中,我将来自cookie的会话ID存储在表单的一个字段中。
- 用户登录,验证输入,创建会话数据并将其与用户记录一起存储,包括表单中的会话ID(真实的会话ID)。然后,用户通过另外两个控制器(LoginCheck、 Jmeter 板)进入 Jmeter 板。
- 在会话期间,用户将频繁地返回到 Jmeter 板。
- 当两个或多个用户(几乎)同时(通过登录或从站点内的页面返回)访问 Jmeter 板页面时,两个用户最终将使用相同的cookie ID和会话数据。我可以通过检查基于浏览器的cookie和存储在$_COOKIE变量中的cookie值来确认这一点。使用不正确的数据简单地刷新页面上的 Jmeter 板,就会加载正确的数据。
我研究过PHP中会话的竞争条件,其中一些提供了使用$_COOKIE来解决会话的竞争条件,所以并没有真正为我提供任何解决问题的方法。
由于我能够捕获问题,我可以很容易地解决它与刷新,但如果有一个更稳定的解决方案可用,我宁愿走这条路。
如有任何建议,我们将不胜感激。
干杯
1条答案
按热度按时间gk7wooem1#
您可以使用带有x或x+标志的fopen来打开共享文件。只有一个示例可以同时打开该文件。
然而你的描述前后矛盾而且怪异您应该不需要在使用您所描述的会话时处理争用条件。我猜问题在于您在每次页面加载时重新生成会话ID,因此您可能正在做一些不应该做的事情。
在会话中,每个用户代理必须只生成一次会话id,但是正如您所描述的,在每次页面更改时都会重新生成该id,并且作为次要问题,它是以低熵生成的。
如果你解决了第一个问题,那么低熵问题将得到缓解,但没有得到解决。