如何使用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代碼大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。