如何限制 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.
午休算番茄工作法中的休息吗? 五分钟。如果用番茄工作法打游戏,能坚持久点。 25 分钟,第一次中断就续不上了 对我来说番茄工作法就跟达芬奇睡眠法一样难受休息又休息不好,工…
我记工作笔记都是用传统的 docs 然后根据项目分成很多很多文件 但是最近发生一件事情让我觉得必须要马上更换自己的笔记方式 我节前去某国内大厂芯片公司去排查一个 EDA 的问题…
基于WEB的HTML 编辑器,WYSIWYG所见即所得的编辑器,或是一个富文本的编辑器,是我们在开发WEB应用时接收用户输入时必需要考虑的问题。下面是一些开源的WEB在线的WY…
合速度