登录  /  注册

php 如何锁定接口,让一个接口,同一时间只处理同一人的一次请求?

php中文网
发布: 2016-09-05 08:59:55
原创
2188人浏览过

目前我用的是在session中设置一个值,每次进来判断这个值是否存在,存在就表示锁定了,不执行本次请求,如果不存在,就设置这个值,并执行后续操作。

<code>class controller{
    function index(){
        if(isset($_SESSION['lock']))
            return;
            
        $_SESSION['lock'] = 1;
        sleep(1);//这里会查询用户的资格,并给用户发送流量,如果两次同时进来,会造成两次都认为是有资格的,并且会给用户发两次相同流量
        unset($_SESSION['lock']);
    }
}
</code>
登录后复制
登录后复制

我本以为这样做是可以的,而且session存在redis里速度蛮快,直到刚才睡不着起来摆弄,发现竟然还是能让一个用户同时的多次同接口请求都执行了。

想要一个人的同时多次请求,只处理第一个。判断是否同一人,根据session来判断。

你们是用什么方法保证这个的?

回复内容:

目前我用的是在session中设置一个值,每次进来判断这个值是否存在,存在就表示锁定了,不执行本次请求,如果不存在,就设置这个值,并执行后续操作。

<code>class controller{
    function index(){
        if(isset($_SESSION['lock']))
            return;
            
        $_SESSION['lock'] = 1;
        sleep(1);//这里会查询用户的资格,并给用户发送流量,如果两次同时进来,会造成两次都认为是有资格的,并且会给用户发两次相同流量
        unset($_SESSION['lock']);
    }
}
</code>
登录后复制
登录后复制

我本以为这样做是可以的,而且session存在redis里速度蛮快,直到刚才睡不着起来摆弄,发现竟然还是能让一个用户同时的多次同接口请求都执行了。

想要一个人的同时多次请求,只处理第一个。判断是否同一人,根据session来判断。

你们是用什么方法保证这个的?

如果涉及到数据库用加锁吧,或者把所有的请求弄成队列一个个的处理吧

我想了想,应该写入两个东西,一个是进入时间,退出时间。
访问开始写入开始时间,退出写入退出时间。
假设第一次访问肯定是都是空的,start=02:26:30 end=02:26:50
那么这样子我重新发起访问的时候,判断一下:
如果start>end,说明在访问中
这边还有一种情况,就是访问发生中断,来不及写入end的时间,所以这边就必须做一个初始化的判断,比如start>end&&start-end>100直接把end改成当前时间,则空闲,进行访问
如果start注:时间戳尽量精确到微秒,方便计算。

可以用数据库来处理啊, 设置一个标识, 用户进入该请求时先去检查数据库, 存在标识不予执行,

使用缓存把正在处理的用户的id存起来,通过过滤器操作id,用户请求进来过滤器判断id不在缓存则添加进来,处理完删除id。

方法很多,问题是你实际的需求是什么,希望你能落到最终数据的角度描述下,说不定不从API角度更简单

从你这个问法来看,你应该是提出了坑爹的解决方案。建议你说出原始需求。

1,如使用Mysql,可以对Mysql进行加锁,一个请求结束以后,释放锁其它请求才能往下执行
2,可以使用计数器,在请求进来的可以往计数器里加一,请求结束以后清空计数器,较推荐这个方法
3,另外,文件的session本身是有锁的,如果同一个用户的每一次请求未结束,其它请求也会在被阻塞

打完一个文件,然后用文件锁 操作完成后 文件解锁 。下个用户才能继续访问 继续加锁

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号