php 一个方法死循环, 其他页面无法访问 ?

1、最近项目中 要处理大量数据,所以发生下面的问题:

public function a(){
    for($i = 1; $i<= 1000001; $i++){
        $data[] = ['a' => $i, 'add_time'=> date('Y-m-d H:i:s')];
    }
}

如果执行上面的方法,那么程序一直在循环,执行其他的方法,会处于等待状态,一直等a方法执行完成才可以运行其他的方法。

为什么呢?

阅读 6.2k
5 个回答

因为php是阻塞性的啊

你可以把这一段
public function a(){

for($i = 1; $i<= 1000001; $i++){
    $data[] = ['a' => $i, 'add_time'=> date('Y-m-d H:i:s')];
}

} 封装成一个方法, 然后访问这个页面的时候,把这个任务丢到redis的队列去中执行啊 。这样就实现了简单的php的异步了啊

多开几个php-fpm进程就可以了。不过还是有问题,同一个IP访问的时候,分配到的php-fpm子进程是同一个,阻塞的话,这个子进程就无法处理任何请求了,也就是说你访问其他页面也不能访问。

可以试试yield...

很正常啊,你的死循环肯定需要一个线程来跑,而php解释器是单线程的,所以对外当前php解释器肯定不能再处理别的文件了,如果你用fpm的话也是一样的,worker进程都占满的话,也是不能再处理新的请求了的

就这样子。

可以放到异步请求上去,页面上加一个 “读取中,请稍后” 类似的提示

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