首頁 > 後端開發 > php教程 > PHP 是單線程語言,那麼 Laravel 要如何非同步處理佇列作業呢?

PHP 是單線程語言,那麼 Laravel 要如何非同步處理佇列作業呢?

Linda Hamilton
發布: 2024-12-01 07:24:18
原創
442 人瀏覽過

PHP is a Single-Threaded Language, So How Does Laravel Handle Queue Jobs Asynchronously?

PHP 被稱為單執行緒語言,這表示它在單一行程中一次只能執行一個任務。然而,Laravel 提供了一個強大的隊列系統來「非同步」處理多個任務。如果 PHP 是單線程的,那麼 Laravel 是如何實現這個魔力的呢?讓我們簡單地分解一下。

什麼是 PHP 進程?

在深入研究隊列之前,我們需要了解什麼是 PHP 流程。

流程就像受僱來完成任務的工人。當您執行 PHP 腳本(例如 php my_script.php)時,作業系統會建立一個新進程。這個過程:

  • 載入 PHP 腳本。
  • 逐步執行程式碼。
  • 任務完成後停止並「死亡」。 例如:
echo "Hello World!";
登入後複製
登入後複製

當您執行此腳本時,PHP 會啟動一個進程,顯示“Hello World!”,然後進程結束。

Web 應用程式中的 PHP

在網路應用程式中:

  • Web 伺服器(如 Apache 或 Nginx)從瀏覽器接收 HTTP 請求。
  • 伺服器建立一個新的 PHP 程序來處理請求。
  • PHP 處理請求(例如,從資料庫取得資料或渲染頁面)。
  • 向瀏覽器發送回應後,該過程結束。
  • PHP 進程是短暫的。他們一次處理一個請求,然後停止。這種設計使 PHP 對於 Web 應用程式來說變得簡單且有效率。

什麼是單線?

PHP 是單線的,意思是:

  • 一個 PHP 行程一次只能處理一項任務。
  • 它不會在同一進程中同時執行多個任務。 例如:
echo "Task 1";
// Waits for Task 1 to finish before starting Task 2
echo "Task 2";
登入後複製

PHP 先執行任務 1。只有完成後,它才會轉移到任務 2。這種行為與 JavaScript 等語言不同,在 JavaScript 中,任務可以在相同進程中並行運行。

那麼 Laravel 如何處理隊列呢?

Laravel 的佇列系統可讓您在背景執行多個任務,而不會阻塞主應用程式。例如:

  • 正在發送電子郵件。
  • 處理影像上傳。
  • 發送通知。 這些任務在背景運行,因此您的主應用程式可以更快地響應用戶。

但是 PHP 一次只能處理一項任務,對嗎? Laravel 如何讓它看起來像是異步的?答案在於工人和多個進程。

什麼是工人?

Laravel 中的 Worker 是一個長時間運行的 PHP 進程,它監聽佇列中的作業並執行它們。

執行指令時:

php artisan queue:work
登入後複製

一個新的 PHP 進程(或工作進程)啟動。這個過程:

  • 連接到佇列系統(如 Redis 或資料庫)。
  • 等待新作業(任務)到達佇列。
  • 一項一項地挑選並處理工作。 範例:假設您有一個發送 1,000 封電子郵件的任務: 主應用程式向佇列發送 1,000 個作業。 工作進程選擇一個作業,發送電子郵件,然後移至下一個作業。

Laravel 如何實現異步行為?

Laravel 透過同時執行多個工作執行緒來實現「非同步」行為。每個worker都是獨立的PHP流程。

工作原理如下:
當您執行 php artisanqueue:work 時,它會從一個工作者(一個 PHP 進程)開始。
您可以使用流程管理器(如主管)啟動多個工作人員在本地和生產中的不同標籤上並行處理作業。
這將啟動多個 PHP 進程。每個工人獨立處理工作,使得任務看起來像是同時運作的。

當作業排隊時會發生什麼事?

當您在 Laravel 中對作業進行排隊時,將逐步發生以下情況:

  1. 創造就業機會: 作業(例如,發送電子郵件)被序列化(轉換為可儲存格式)並添加到佇列後端(如 Redis 或資料庫)。
  2. Worker 輪詢隊列: 工人們不斷檢查隊列中是否有新的工作。 如果找到工作,工人就會接手。
  3. 作業執行: 工作執行緒反序列化作業並執行其handle()方法。 完成後,該作業將標記為已完成。
  4. 工作完成狀況: 工作人員從佇列中刪除作業。

如果作業失敗,Laravel 會重試或將其移至「失敗作業」清單(根據您的配置)。

範例場景:發送電子郵件
假設您有一個 Laravel 應用程序,用戶在其中提交聯絡表單。提交表格後:

  • 主應用程式處理表單並立即回應使用者。
  • 它不是立即發送電子郵件,而是將電子郵件發送任務新增到佇列中。

背景:

  • 一名工人接手發送電子郵件的工作。
  • 發送電子郵件。
  • 轉到下一個工作。
  • 這樣,使用者就不必等待電子郵件發送,從而使應用程式更快。

工人在生產上如何奔跑?

在生產中,Laravel 工作人員由 Supervisor 等工具進行管理。主管讓工作人員 24/7 持續運行,並在崩潰時重新啟動他們。

Supervisor 設定範例:

echo "Hello World!";
登入後複製
登入後複製

指令:執行queue:work指令。
numprocs=5:啟動 5 個工作進程(5 個 PHP 進程)來處理作業。

它真的是異步的嗎?

從技術上講,Laravel 佇列不像 JavaScript 或 Node.js 處理任務那樣是非同步的。相反:

每位工人一次處理一項工作。
多個工作執行緒(進程)提供並行性,呈現非同步執行的外觀。

需要記住的要點

  • PHP 是單執行緒的,因此單一 PHP 進程一次處理一項任務。
  • Laravel 使用工人(長時間運行的 PHP 流程)來處理佇列作業。
  • 多個worker可以同時執行,允許並行處理作業。
  • 佇列後端(如 Redis)充當中間人來儲存作業,直到工作人員拿起它們。
  • Supervisor 等工具可確保工人在生產中持續運作。

Laravel 的佇列系統是一種在背景處理任務的智慧方式,可以提高應用程式效能和使用者體驗。雖然 PHP 本身是單線程的,但 Laravel 透過運行多個進程(worker)來實現並行性。這種簡單而有效的設計使 Laravel 能夠處理繁重的工作負載,即使有 PHP 的限制。

以上是PHP 是單線程語言,那麼 Laravel 要如何非同步處理佇列作業呢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板