溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用spatie/async庫來寫異步的PHP代碼

發布時間:2020-11-10 10:03:34 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

如何使用spatie/async庫來寫異步的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 () {
        // 哦,不! 一個過程花了太長時間才完成。 讓我們做點什么吧
    })
;

感謝各位的閱讀!看完上述內容,你們對如何使用spatie/async庫來寫異步的PHP代碼大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女