gpt4 book ai didi

php - 如何测试由对 php 的多个 ajax 请求创建的竞争条件?

转载 作者:可可西里 更新时间:2023-10-31 23:31:12 25 4
gpt4 key购买 nike

我正在使用 PHP 在数据库中创建一些对象。有时,如果用户在创建对象时请求对象,他们可以看到部分创建的对象(主数据库条目存在但尚未插入所有子对象)。我最近实现了一个修复程序,我的代码将仅在通过向数据库条目添加“创建”标志完全创建对象后提供该对象。

我如何测试它?我正在使用 phpunit。我看到的两个问题是我需要并行线程来同时发出创建和获取请求,并且我需要确保时机正确以便我可以实际测试竞争条件(而不仅仅是获取对象完全创建之后)。我希望我的测试看起来像这样,但我愿意接受建议:

  1. 线程 1:创建对象
  2. 线程 2:尝试在对象完全创建之前获取对象(应返回错误)
  3. 线程 1:在对象创建后获取对象(应该可以)

最佳答案

在实际支持线程的语言中测试竞态条件已经很困难了——对于 PHP,这就更难了。在单线程上下文中,您必须并行触发多个请求,保持这些请求的正确顺序,以便测试不会随机失败。

我做过一次检查 PHP session 锁定是否正常工作的测试:

在 PHPUnit 中,我创建了一个 curl_multi_query,在一个专门准备的 php 脚本中向网络服务器发出三个请求,该脚本基本上只启动一个 session ,然后休眠一秒钟。

如果三个请求的执行持续时间超过2.5秒左右(不要问那个时间),则测试成功。

我假设请求将以任何(可能是随机的)顺序得到答复。我不确定 curl 扩展是否能保证按特定顺序启动请求。此外,我不确定网络服务器在几乎立即收到三个请求时将如何操作。我必须假设检测锁定是否成功的唯一方法是测量耗时。

特别是我不确定创建一个将触发两个并行请求的测试,期望第一个请求成功,第二个请求总是失败,就像你想要的那样,是否会可靠地成功。唯一的期望是两个请求中的一个会失败。

关于php - 如何测试由对 php 的多个 ajax 请求创建的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21880277/

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