• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP 多个用户瞬时间同时访问时,如何实现类似独占进程一样,只执行一次

php 搞代码 4年前 (2022-01-25) 24次浏览 已收录 0个评论
文章目录[隐藏]

场景:
1. 多个用户同时访问一个页面(包含该程序),或者一个页面同时请求多次该程序
2. 两次请求之间的时间非常短,以至于来不及使用flock或者借助数据库来判断程序是否正在执行
3. 仅在普通的虚拟主机中运行,exec等函数肯定是要禁用的,redis等也并没有提供

问题:
如何在这么短的时间间隔内,保证这段程序仅执行一次?

本文来源gaodaimacom搞#^代%!码&网*

搞代gaodaima码

回复内容:

场景:
1. 多个用户同时访问一个页面(包含该程序),或者一个页面同时请求多次该程序
2. 两次请求之间的时间非常短,以至于来不及使用flock或者借助数据库来判断程序是否正在执行
3. 仅在普通的虚拟主机中运行,exec等函数肯定是要禁用的,redis等也并没有提供

问题:
如何在这么短的时间间隔内,保证这段程序仅执行一次?

我觉得可以从2方面实现。

第一种就是尽量缩短读写锁用的时间,这个可以用nosql来做,memcache就可以了。但是要搞清楚你要精确到什么时间单位。

第二种就是把这个程序变成常驻后台的程序,如命令行程序,使用socket等与常规业务逻辑交换数据。推荐使用swoole拓展来实现。

<code><?phpif(!file_exists($flag)) {    //如果标记文件不存在,则执行命令ls.执行命令前新建标记文件.    touch($flag);    exec('ls -lha /tmp', $output, $return_var);} else {    exit('命令已经被其他请求执行过');}</code>

通过锁机制解决,乐观锁或者悲观锁处理冲突。

可以将用户访问后可以利用redis或者memcache写入相关数据(此步不执行操作,只是记录,有用户需要操作而已),然后依靠队列功能,服务器异步处理刚刚写入的数据(一旦执行成功,后面的队列都执行失败)

对于这个问题个人觉得就不应该考虑多个请求的进程复用性,原因对于动态网站,数据可能是不一样的,是因为你要加载很多code的效率低呢还是你的业务数据效率低,一般都是业务的数据慢,而不是code解析很慢。如果是业务数据考虑用cache, php的code用opcache就可以了。

对于fpm来说,每个请求都会使用一个进程来处理.不管你间隔时间多短,同时有多少人,规则都是一次请求使用一个进程处理,毕竟本来就是无状态的.你希望有状态,确保诸如生成页面的程序执行一次,那么可以使用缓存,对于竞争生成缓存的情况,可以用缓存锁,例如memcached的add,确保生成缓存的行为只执行一次,若连memcached都没有的话,对于单机环境下,可以考虑使用apc或者apcu.如果memcached没有的话,对于页面的生成,nginx也有个模块可以确保生成缓存的.


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP 多个用户瞬时间同时访问时,如何实现类似独占进程一样,只执行一次

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址