推薦:《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中文網其他相關文章!