PHP先后请求调用一个方法,如果过第一次请求处理没结束,第二次又调用会有什么影响?

后台定时任务轮询调用一个方法,每秒执行一次,主要是从数据库取出几十条数据循环进行处理,处理结束整个循环大概要3秒钟,每秒轮询的话,第一次还没处理完,紧接着调用会有什么影响吗?它是怎样的一个执行流程,是会被阻塞吗?还是我需要使用文件锁,当循环执行完成再释放

阅读 4k
3 个回答

首先这个问题本质就是一个并发处理互斥资源的问题

  1. 解决你提问的的最简单方法,启动一个进程,依次处理,然后再迭代即可

伪代码:

<?php
# do.php
while(true) {
    $rows = mysql_fetch_rows();
    foreach ($rows as $row) {
        do_something(row);
        usleep(500000);
    }
    //todo record log
    sleep(1);
}

php do.php
  1. 进阶处理:你可以学习多进程,分布式锁相关来做资源互斥的处理(文件锁,redis锁,zookeeper锁都可以);

当然直接利用mysql的排他锁也可以简单解决一个互斥问题,不过会带来更多其他问题

第一次没执行完,再次调用会再执行一次,因为不同的进程再处理,这肯定不是你想要的结果,所以你需要自行处理掉,文件锁或者redis锁都行。

这个问题可以思考下,当多用户同时点赞该文章的时候是怎么实现的?因为操作的流程一般是取值,修改,存值。如果它们都是同时操作,不考虑误差,不做其它处理,那么大家所操作的流程都是 获取 0 ,修改 0 + 1 ,保存 1.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题