hyperf/model-cache

使用`findManyFromCache($ids)`的时候,同一个浏览器下两次请求进入控制器的时间产生了间隔

Closed this issue · 12 comments

问题描述:

在我的本地环境下,当我使用findManyFromCache($ids)的时候

  1. 在没有缓存的情况下,当$ids大于400之后,同一个浏览器下两次请求进入控制器的时间产生了间隔。
  2. 在缓存生成后或者$ids小于400的时候,同一个浏览器下没有两次请求进入控制器的时间产生了间隔这种情况发生。
  3. 在直接请求数据库limit()->get()的时候,同一个浏览器下没有两次请求进入控制器的时间产生了间隔这种情况发生。
  4. 在不同浏览器下发送请求,没有两次请求进入控制器的时间产生了间隔这种情况发生。

而且,这个间隔非常的相似,20s
所以,想请教一下,这个可能是我这里什么原因导致的?

php版本和swoole扩展

image
image

代码:

image

实验内容:

分别尝试limit100、400、500、1000的情况下请求是否产生了间隔。

实验结果:

1.清除缓存,使用一个浏览器发送两个请求,limit限制100
image

2.清除缓存,使用一个浏览器发送两个请求,limit限制400
image

3.清除缓存,使用一个浏览器发送两个请求,limit限制500
image

4.清除缓存,使用一个浏览器发送两个请求,limit限制1000
image

5.清除缓存,使用两个浏览器发送两个请求,limit限制1000
image

既然不同的浏览器没有这个问题,那只能是你浏览器有什么限制了

@limingxinleo
两个浏览器同时发送两次请求是指,A与B浏览器同时请求一次,这种情况下没有产生时间间隔。
单独用A或B的话,都会产生时间间隔。
为了避免是由于我的机器原因导致,所以我在不同的机器上进行了尝试。发现均是这种情况。
并且每次产生的间隔都是_20s_

既然你不同的浏览器没有问题,框架肯定是没问题的。。。

框架跟浏览器无关,你直接curl测试也可以。

为了尽量减少不定因素,建议你把进程数也改成1试试

我尝试了一下以下方式
1.使用接口工具同时请求两次,间隔仍然存在
2.new XMLHttpRequest() Promise.all(),同时请求两次,间隔没有了。
3.curl确实没有出现间隔,但是curl不是会被识别为不同客户端吗?(和两个不同的浏览器去请求结果一致)
综上,可能是被识别成同一客户端的请求才会出现时间间隔,并且直接get()数据库并没有这种情况,只有再超过400条ID的findManyFromCache()情况下才会有。
但是总得来说,api的时候不会出现这个间隔就已经满足了我目前的需求。

我尝试了一下以下方式
1.使用接口工具同时请求两次,间隔仍然存在
2.new XMLHttpRequest() Promise.all(),同时请求两次,间隔没有了。
3.curl确实没有出现间隔,但是curl不是会被识别为不同客户端吗?(和两个不同的浏览器去请求结果一致)
综上,可能是被识别成同一客户端的请求才会出现时间间隔,并且直接get()数据库并没有这种情况,只有再超过400条ID的findManyFromCache()情况下才会有。
但是总得来说,api的时候不会出现这个间隔就已经满足了我目前的需求。

你把进程数改成1再试试

刚才尝试的时候,worker已经改成1了。

你Swoole什么版本,hyperf框架是什么版本。用的什么风格服务,异步风格还是协程风格,把server.php的配置发一下我看看。

看了一下鸟哥的这个https://www.laruence.com/2011/07/16/2123.html
可能是浏览器客户端就是这样的原因。

好的

image
swoole4.6.7
image

hyperf2.1
image