对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任务而不让它们相互阻塞,这意味着我们需要一个非阻塞进程,那该怎么办呢?这种方法需要在 PHP 中应用异步编程方法,这里的任务将在不相互依赖的情况下执行。
在 PHP 中实现非阻塞执行的一种常见方法是实现队列处理。任务被持久保存到 MySQL、Redis、Amazon SQS 等传输系统中,该传输系统由后台 worker 检索并相应地执行,从而不会阻塞创建任务的主进程。Laravel 应用程序提供了一种队列机制,允许将任务(在本例中称为作业)推迟到稍后的时间进行处理。
另一种方法是并行运行所有定义的任务。我们从这种方法中知道的是,特定的任务完成后,它可以立即将控制权交还主进程,并承诺执行代码并在稍后通知我们结果(例如回调)。人们可能很少看到并行处理方法的用例;示例用例可能是执行图像处理并向某些外部服务发出 GET 请求。
让我们通过一个非常简单的用例来看看 PHP 中同步和异步(并行)流程之间的区别。
同步代码
foreach (range(1, 5) as $i) {
$output = $i * 2;
echo $output . "\n";
}
异步代码
use Spatie\Async\Pool;
$pool &#