当前位置:主页 > 聚焦 >

教你使用spatieasync库来写异步的PHP代码

时间:2020-11-09 20:06:44

  

  

:《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 仓库。

  

原文地址:

  译文地址:

热点推荐
1 纽约法官暂停涉及380万比特币的诉讼

消息,纽约州法官凯西金已暂停对39,069个沉睡比特币钱包的诉讼程序,推迟在7月14日的法庭听...

2 Bitget上线铠侠、东京电子、斗山能源等

消息,Bitget宣布已上线铠侠、东京电子、住友电气、爱德万测试、雷射科技、斗山机器人、斗...

3 KuCoin:BABYUSDT永续合约资金费率间隔调整

消息,KuCoin宣布BABYUSDT永续合约资金费率间隔调整。请注意,期货交易是一项高风险活动,可能...

4 以色列官员证实,以色列对伊朗的一处石

消息,据以色列媒体N12,以色列官员证实,以色列对伊朗的一处石化设施发动了袭击。...

5 苹果AI大重构内幕:Vision Pro负责人罗克韦

消息,苹果公司正在进行AI业务的重大重构,Vision Pro负责人迈克罗克韦尔被任命为Siri团队的新...

6 江卓尔:Strategy不会大幅净卖出BTC

消息,莱比特矿池CEO江卓尔发推表示,他认为Strategy不会大幅净卖出BTC,并给出三点理由:第一...

7 Yuga Labs完成白帽行动追回多种NFT资产

消息,Yuga Labs首席执行官Michael Figge在X平台发文称,团队已完成针对Flooring Protocol漏洞的白帽行...

8 XBIT DEX:霍尔木兹海峡交通预计6月底恢复

消息,预测市场显示,霍尔木兹海峡交通预计将在6月底恢复正常,当前「宏观经济」板块热门...

9 美官员:以方“勉强同意”按兵不动,特

一名美国高级官员和一名熟悉通话细节的以色列消息人士透露,特朗普当地时间周日在电话中...

10 地址0x709…cad6e再次建仓,抵押10570 ETH借出

消息,链上分析师AI姨指出,地址0x709cad6e时隔六个月再次建仓,14小时前抵押10570 ETH借出1600万...

成都来彰科技 蜀ICP备2025134723号-1

资讯来源互联网,如有版权问题请联系管理员删除。