注意:部分文章发布时间较长,可能存在未知因素,购买时建议在本站搜索商家名称,先充分了解商家动态。
交流:唯一投稿邮箱:hostvps@88.com。
网友 wfc 说:
*帖最后由 wfc 于 2022-7-16 07:53 编辑
a.php实际上每秒有10个ip同时访问,如何实现每秒只执行一个ip的请求,同一秒剩余9个的请求实际上代码是不执行的?
想了半天找不到解题思路
大佬果然厉害,感谢各位
网友 mslxd 说:
说得太复杂,,,,
做一个文件锁就行了
touch(‘abc.lock’)
如果存在这个abc.lock 就不执行了
事情做完了,把abc.lock删掉
网友 司马南 说:
*帖最后由 司马南 于 2022-7-16 07:16 编辑
等待一秒后执行下一次?
sleep
网友 FeiLai 说:
以我半杯水的水平只能想到用mys*l来限制
网友 wfc 说:
司马南 发表于 2022-7-16 07:14
等待一秒后执行下一次?
网友 gzlock 说:
需要额外的存储来限制,例如redis
网友 司马南 说:
wfc 发表于 2022-7-16 07:16
sleep不行的,其他ip请求会执行
网友 wfc 说:
gzlock 发表于 2022-7-16 07:17
需要额外的存储来限制,例如redis
网友 wfc 说:
司马南 发表于 2022-7-16 07:19
包起来啊加个判断,
网友 snoywing 说:
*帖最后由 snoywing 于 2022-7-16 07:25 编辑
队列,请求都插队列里,如果当前请求在队列是当前秒数第一则处理,队列数据存活周期两秒。
另外利用悲观锁应该也能实现
网友 wfc 说:
snoywing 发表于 2022-7-16 07:23
队列,请求都插队列里,如果当前请求在队列是当前秒数第一则处理,队列数据存活周期两秒。
另外利用悲观锁 …
网友 司马南 说:
wfc 发表于 2022-7-16 07:22
其他ip的同一秒请求在a.php会认为是一个新的请求
网友 大雄。 说:
不懂
网友 snoywing 说:
wfc 发表于 2022-7-16 07:27
大佬这个好像有用,我找找代码试试
网友 snoywing 说:
如11楼所说,nginx做穿透命中控制也可以
网友 妖言惑众 说:
redis或者nginx limit
网友 mslxd 说:
说得太复杂,,,,
做一个文件锁就行了
touch(‘abc.lock’)
如果存在这个abc.lock 就不执行了
事情做完了,把abc.lock删掉
网友 plugins 说:
生成队列,存储到***里面,**每秒用CRON查询前一秒的队列,选择其中一个执行
网友 ii** 说:
全局队列 卡夫卡等 很多办法
网友 mean 说:
不用现成工具的话(各种网关、阿里的 sentinel),可以自己实现一个限流算法:漏桶或者令牌桶(突发)。确定算法后找对应语言的现成实现,很多时候分布式**还需要借助中间件(redis, am*p)来具体实施
网友 c7r1st 说:
加锁
网友 wfc 说:
mslxd 发表于 2022-7-16 08:57
说得太复杂,,,,
做一个文件锁就行了
网友 翻车的老司机 说:
目录下生成个时间*命名的文件,php执行时候读当前时间*,对比之前那个。
网友 rw1024 说:
这你得说明下,剩余9个是直接进入队列等待执行,还是直接拒绝请求。
如果进入队列,建议你了解下swoole协程
如果是直接拒绝,在你执行文件里可以使用redis自行封装一个方法
例如:if(!$redis->setOrnull()){header(&*uot;HTTP/1.0 404 Not Found&*uot;);}
自行封装setOrnull方法为 判断key是否存在,存在返回false 不存在则写入返回true 缓存周期1秒
贝壳主机网

