1、最近项目中 要处理大量数据,所以发生下面的问题:
public function a(){
for($i = 1; $i<= 1000001; $i++){
$data[] = ['a' => $i, 'add_time'=> date('Y-m-d H:i:s')];
}
}
如果执行上面的方法,那么程序一直在循环,执行其他的方法,会处于等待状态,一直等a方法执行完成才可以运行其他的方法。
为什么呢?
1、最近项目中 要处理大量数据,所以发生下面的问题:
public function a(){
for($i = 1; $i<= 1000001; $i++){
$data[] = ['a' => $i, 'add_time'=> date('Y-m-d H:i:s')];
}
}
如果执行上面的方法,那么程序一直在循环,执行其他的方法,会处于等待状态,一直等a方法执行完成才可以运行其他的方法。
为什么呢?
多开几个php-fpm进程就可以了。不过还是有问题,同一个IP访问的时候,分配到的php-fpm子进程是同一个,阻塞的话,这个子进程就无法处理任何请求了,也就是说你访问其他页面也不能访问。
很正常啊,你的死循环肯定需要一个线程来跑,而php解释器是单线程的,所以对外当前php解释器肯定不能再处理别的文件了,如果你用fpm的话也是一样的,worker进程都占满的话,也是不能再处理新的请求了的
2 回答1.3k 阅读✓ 已解决
1 回答953 阅读✓ 已解决
2 回答839 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答895 阅读
1 回答883 阅读
1 回答814 阅读
因为php是阻塞性的啊
你可以把这一段
public function a(){
} 封装成一个方法, 然后访问这个页面的时候,把这个任务丢到redis的队列去中执行啊 。这样就实现了简单的php的异步了啊