首頁  >  文章  >  後端開發  >  教你使用spatie/async函式庫來寫非同步的PHP程式碼

教你使用spatie/async函式庫來寫非同步的PHP程式碼

藏色散人
藏色散人轉載
2020-11-09 15:33:435130瀏覽

推薦:《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程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除