教你运用spatie/async库来写异步的PHP代码
引荐:《PHP视频教程》
关于大多数用 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 = Pool::create(); foreach (range(1, 5) as $i) { $pool[] = async(function () use ($i) { $output = $i * 2; return $output; })->then(function (int $output) { echo $output . "\n"; }); } await($pool);
当我们施行第一个代码时,我们将按以下次序获得输出值:
2 4 6 8 10
重试施行,我们将获得与上面雷同的次序的输出。因此,每个乘法运算都要鄙人一个乘法运算此前等候施行。接下来,运转第二个代码块,让我们看看我们得到了什么。
6 10 2 8 4
第二次重试施行:
2 6 4 10 8
一个历程发生两个不一样的结果。这正是我们使用异步办法所得到的结果。我们的小任务可以以一种互不堵塞的方式施行。每个乘法任务都是独立施行的,有些施行得比其他任务快,因此输出结果纷乱无序。别的,请留意我们的异步函数作为 then 办法附加,该办法负责取回操纵权,并且它接受回调函数作为其参数,该回调函数此刻可以对接收到的输出施行额外的操纵。
Spatie 的工作人员开发了这个很好的spacee/async
包,它有助于并行施行任务。你可以通过 Composer 安置该包:
composer require spatie/async
该包供给了一种奇妙的方式来与创立的任务停止交互,这些任务将被并行施行。任务的事件监听器描写如下:
- 当任务完成时再施行一次操纵,是由于回调可以通过它的
then
办法来实现。 - 当一个特定的任务使用
catch
办法抛出非常时,错误处置更容易操纵。 - 当一个任务没有完成其操纵时,
timeout
办法同意人们处置这样的场景。
事件监听器与如下所示的任务挂钩:
$pool ->add(function () { // 要在并行进程中施行的任务 }) ->then(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代码的具体内容,更多请关注百分百源码网其它相关文章!