>  기사  >  백엔드 개발  >  spatie/async 라이브러리를 사용하여 비동기 PHP 코드를 작성하는 방법을 가르칩니다.

spatie/async 라이브러리를 사용하여 비동기 PHP 코드를 작성하는 방법을 가르칩니다.

藏色散人
藏色散人앞으로
2020-11-09 15:33:435358검색
"

PHP로 작성된 대부분의 프로그램의 유일한 목적은 여러 작업으로 구성된 간단한 프로세스를 수행하는 것입니다. 작업은 데이터 처리와 같이 순서대로 실행되어야 합니다. 우리는 항상 동기 프로그래밍의 정지와 대기를 견뎌야 합니다. 코드 실행의 동기식 스타일을 차단이라고 하며, 이는 작업이 차례로 실행된다는 의미입니다. 그렇다면 서로를 차단하지 않고 작업을 실행하려면 어떻게 해야 할까요? 즉, 비차단 프로세스가 필요하다는 의미입니다. 이 접근 방식을 사용하려면 PHP에서 작업이 상호 의존 없이 실행되는 비동기 프로그래밍 방법을 적용해야 합니다.

PHP에서 비차단 실행을 달성하는 일반적인 방법은 대기열 처리를 구현하는 것입니다. 작업은 MySQL, Redis, Amazon SQS 등과 같은 전송에 유지되며, 이는 백그라운드 작업자에 의해 검색되고 작업을 생성한 기본 프로세스를 차단하지 않고 그에 따라 실행됩니다. 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 메서드를 사용하면 작업이 작업을 완료하지 못하는 경우 시나리오를 처리할 수 있습니다.
spacee/async包,它有助于并行执行任务。你可以通过 Composer 安装该包:
$pool
    ->add(function () {
        // 要在并行进程中执行的任务
    })
    ->then(function ($output) {
        // 如果成功,进程或者你传递到队列的回调函数会返回`$output`。
    })
    ->catch(function ($exception) {
        // 当进程内抛出异常时,它会被捕获并传递到这里。
    })
    ->timeout(function () {
        // 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
    })
;

该包提供了一种巧妙的方式来与创建的任务进行交互,这些任务将被并行执行。任务的事件监听器描述如下:

  • 当任务完成时再执行一次操作,是因为回调可以通过它的then方法来实现。
  • 当一个特定的任务使用catch方法抛出异常时,错误处理更容易控制。
  • 当一个任务没有完成其操作时,timeout方法允许人们处理这样的场景。

事件监听器与如下所示的任务挂钩:

rrreee

要了解更多关于这个spacee/async이벤트 리스너는 다음과 같은 작업에 연결됩니다:

rrreee
spacee/async 패키지에 대해 자세히 알아보려면 해당 패키지 기여자들의 글을 읽어보세요. GitHub 저장소를 참조할 수도 있습니다.

원본주소 : https://dev.to/webong/using-asynchronous-processes-in-php-7io

번역주소 : https://learnku.com/php/t/51334🎜🎜

위 내용은 spatie/async 라이브러리를 사용하여 비동기 PHP 코드를 작성하는 방법을 가르칩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제