教你使用spatie/async库来写异步的PHP代码教你用spatie/async库写异步PHP代码,推荐:《PHP视频教程》
对于大多数用PHP编写的程序来说,它唯一的目的是执行一个由多个任务组成的简单过程,其中任务必须按顺序执行,比如数据处理。我们总是要忍受同步编程的停止和等待。代码执行的同步方式叫阻塞,就是一个一个的执行任务。所以,如果我们想在不阻塞彼此的情况下运行任务,这意味着我们需要一个非阻塞的过程,那么怎么办?呢?这个方法需要在PHP中应用异步编程方法,这里的任务将在不相互依赖的情况下执行。
在PHP中实现非阻塞执行的一种常见方式是实现队列处理。任务持久存储在MySQL、Redis、Amazon SQS等传输系统中,由后台工作人员检索并相应执行,从而不阻塞创建任务的主要过程。Laravel应用程序提供了一种排队机制,允许任务(在本例中称为作业)推迟到稍后的时间进行处理。
另一种方法是并行运行所有定义的任务。我们从这个方法中知道的是,特定任务完成后,它可以立即将控制权返回给主进程,并承诺执行代码,稍后通知我们结果(比如回调)。人们可能很少看到并行处理方法的用例;一个示例用例可能是执行图像处理并向某个外部服务发送GET请求。
让我们通过一个非常简单的用例来看看PHP中同步和异步(并行)流程之间的区别。
同步代码
foreach(范围(1,5)为$i) {
$ output=$ I * 2;
echo $输出。\ n ‘;
}异步代码
使用Spatie \ Async \ Pool
$ pool=pool : create();
foreach(范围(1,5)为$i) {
$ pool[]=async(function())use($ I){
$ output=$ I * 2;
返回$ output
})-然后(function (int $output) {
echo $输出。\ n ‘;
});
{}
wait($ pool);当我们执行第一个代码时,我们将按以下顺序获得输出值:
2
四
六
八
10,我们会得到和上面一样的输出顺序。因此,每次乘法运算都必须等待执行,才能进行下一次乘法运算。接下来,运行第二个代码块,看看我们得到了什么。
六
10
2
八
4第二次重试执行:
2
六
四
10
8一个过程产生两种不同的结果。这正是我们用异步方法得到的。我们的小任务可以以非阻塞的方式执行。每个乘法任务都是独立执行的,有些执行的速度比其他的快,所以输出结果是无序的。此外,请注意,我们的异步函数被附加为一个负责检索控件的then方法,它接受一个回调函数作为其参数,现在可以对接收到的输出执行额外的操作。
Spatie的工作人员开发了这个优秀的space/async包,有助于并行执行任务。您可以通过Composer安装该软件包:
Composer require spatie/async该包提供了一种与创建的任务进行交互的聪明方法,这些任务将并行执行。任务的事件侦听器描述如下:
任务完成后,操作会再次执行,因为回调可以通过它的then方法实现。当特定任务使用catch方法引发异常时,错误处理更容易控制。当一个任务没有完成它的操作时,超时方法允许人们处理这样的场景。事件侦听器链接到以下任务:
$pool
-add(function () {
//并行执行的任务
})
-然后(function ($output) {
//如果成功,您传递给队列的进程或回调函数将返回`$output`。
})
-catch(function ($exception) {
//当进程中抛出异常时,会被捕获并传递到这里。
})
-timeout(function () {
//哦不!一个过程需要太长时间才能完成。让我们做点什么
})
;要了解关于这个spacee/async包的更多信息,请阅读这篇文章的作者之一,你也可以参考GitHub资源库。
原地址:https://dev.to/webong/using-asynchronous-processes-in-php-7io
翻译地址:https://learnku.com/php/t/51334
以上是教你使用spatie/async库编写异步php代码的详细内容。请多关注其他关于雷伊PHP知识的相关文章!