百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 教你运用spatie/async库来写异步的PHP代码
分享文章到:

教你运用spatie/async库来写异步的PHP代码

发布时间:12/01 来源:未知 浏览: 关键词:

引荐:《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代码的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有167人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板