温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用spatie/async库来写异步的PHP代码

发布时间:2020-11-10 10:03:34 来源:亿速云 阅读:105 作者:小新 栏目:编程语言

如何使用spatie/async库来写异步的PHP代码?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!                                      

对于大多数用 PHP 编写的程序,它的唯一目的是执行由多个任务组成的简单进程,其中任务必须按顺序执行,如数据处理。我们总是不得不忍受同步编程的停止和等待。代码执行的同步风格被称为阻塞,这意味着任务将一个接一个地执行。那么,如果我们想要运行任务而不让它们相互阻塞,这意味着我们需要一个非阻塞进程,那该怎么办呢?这种方法需要在 PHP 中应用异步编程方法,这里的任务将在不相互依赖的情况下执行。

在 PHP 中实现非阻塞执行的一种常见方法是实现队列处理。任务被持久保存到 MySQLRedis、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 () {
        // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
    })
;

感谢各位的阅读!看完上述内容,你们对如何使用spatie/async库来写异步的PHP代码大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI