如何限制 PHP 每秒只执行一次?
a.php 实际上每秒有 10 个 ip 同时访问,如何实现每秒只执行一个 ip 的请求,同一秒剩余 9 个的请求实际上代码是不执行的?
想了半天找不到解题思路
修改 nginx 配置文件,把最大并发 IP 设为 1
limit_conn perip 1
换个思路,让每个执行都持续一秒。
加锁和队列?
#1 #2 严禁掩耳盗铃🐶 😂
这还用思路?
首先,多个请求,他们得有一个协商的地方,就是得有个公共的地方能存储状态
数据库,redis,memcache,或者 shmem
然后按秒做标志,考虑好锁存机制
或者利用关系数据库的一些特性去做,比如利用 mysql 的 unique 索引实现天然锁
用 mode 为 x 的 fopen 方式打开文件名为秒级时间戳的文件,
这样再某一秒中只有第一个 fopen 能成功,
www.php.net/manual/zh/function.fopen.php
#6
然后第一个打开成功,30ms 后 PHP 执行退出了,下一个又打开了?
伪代码:
if(!Redis::set(time())) return;
执行完 sleep 1 秒,
嘿嘿
存一个时间戳,没过期之前都返回缓存结果,过期执行实际代码更新缓存
redis 存一个 1s 过期的 key ,存在就不执行,不存在就执行,执行完继续存这个 key 。
起消息队列,消费者一秒只处理一个
php 的话可以用 laravel 的原子锁
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('foo', 1);
if ($lock->get()) {
// 锁定 1 秒...
}
public static function lock($key, $ttl)
{
return apcu_add($key, 1, $ttl);
}
漏桶算法
想要简单点可以直接用 apisix 网关管理
那不在这一秒执行的其他请求怎么处理,是直接返回 503 还是进入队列等待下一秒?
我觉得 LZ 没想清楚的事情是,不是一秒钟内执行一个,而是每一秒钟怎么调配给不同的请求,是时间分配给请求,而不是请求来抢占时间。
redis setnx ,过期时间设为 1 秒 setnx 返回 1 的那个执行,其他的不执行
搜“限流”,有算法,也有解决方案。
rxjs 可以做到,不过嘛这玩意学起来很难
是期望“每秒”只有一个请求,还是同一个时间点只有一个请求。区别很大,解决的思路很简单。
装个 redis ,获取原子锁,没有群的要等
这个只是限制一个连接,真正限制请求要加上 limit req 1r/s
加一层缓存就行了呗,一秒内的请求都走缓存
php 进程池只开一个呢,为啥会有这种奇怪的需求,原始需求是啥?如果是防止并发出错,可以加锁。
第一个 ip 访问进来写一个 session ,第一个进来,如果有这个值就 return ,没试过,不知道能否实现你的要求
加锁就行了
java 思路
请求扔队列,根据 ip 分组。
所有请求共用互斥锁,定义个守护线程循环 wait 、notify.
首先,先跟大家道歉一下最近CoolShell大约长达一个多月没有什么更新,原因主要在于,我去看世界杯去了,这一个月的世界杯熬夜看球使我的精力不佳,导致世界杯结束后的几个星期也没…
现在 pixel2 日常使用还很流畅,pixel8 作为备用机用七年肯定没问题,绝对是体验 Android 系统和作为开发机的首选,就是价格有点贵,大家有靠谱入手渠道吗,还是一…
个人比较喜欢简洁的框架,最近看了下 go 的 web 框架 Echo,非常喜欢它的设计,看上去挺像 koa2 的。 支持分组中间件,路由中间件,这个很棒。 最近才开始学习了下 …