Swoole v6 能否讓 PHP 再次偉大?

Yxh_blogs發表於2024-06-27

大家好,我是碼農先森。

現狀

傳統的 PHP-FPM 也是多程序模型的的執行方式,但每個程序只能處理完當前請求,才能接收下一個請求。而且對於 PHP 指令碼來說,只是接收請求和響應請求,並不參與網路通訊。對資料庫資源的操作,也是一次請求一次有效,用完即銷燬不能複用,在系統高負載的情況下對資料庫等資源的消耗會很大,能承受的併發量有限。

Swoole 的出現給 PHP 帶來了一種新的執行方式,完全接管了 PHP-FPM 的功能,並且彌補了 PHP 在非同步網路通訊領域的空白。Swoole 提供了 PHP 的全生命週期管理,此外 Swoole 的常駐程序模式,也能夠高效的利用資源,比如可以建立資料庫連線池、共享記憶體變數等。還有 Swoole 中能夠支撐高併發的利器「協程」,更加使 PHP 的效能上了一個新的臺階,甚至在某些特定場景下都可以與 Go 語言的效能相媲美。

雖說 Swoole 給 PHP 帶來了很大的效能提升,但也還是一個基於多程序模型的非同步通訊擴充套件,多程序的模式也存在著許多的問題,比如跨程序間的通訊、程序間的資源共享等問題。簡而言之,多程序會帶來一定的系統資源消耗及產生新的問題。

因此 Swoole 官方為了解決多程序的問題,引進了多執行緒的支援,這意味著 v6 版本之後,Swoole 將會變成單程序多執行緒的執行模式。

v6 新特性

根據 Swoole 作者韓天峰釋出的預告,在 v6 版本中增加多執行緒的支援。其中多執行緒的實現是基於 PHP 的 ZTS 機制和 TSRM API,在 PHP 層面隔離所有全域性變數,實現執行緒安全。Swoole v6 的多執行緒將是真正的多執行緒實現,在單程序的模式下所有的 PHP 程式程式碼均是在多核並行執行,能夠高效的利用好 CPU 資源。

v6 版本還提供了執行緒安全的 Map 和 ArrayList 資料結構,可以實現跨執行緒的資料共享讀寫。在 Server 端的 Event Worker、Task Worker、User Process 等將全部替換為 執行緒的執行方式,在同一個程序空間內執行,徹底摒棄了多程序的模式。

當然新的特性勢必會帶來新的開銷,對於 Map 等共享的資料結構在多執行緒的模式下需要加鎖,來避免資料競爭,可能會損耗一些效能。

以下是列舉的一些執行緒相關的 API 方法:

  • use Swoole\Thread 執行緒物件。
  • use Swoole\Thread\Map 執行緒安全下的 Map 資料結構。
  • use Swoole\Thread\ArrayList 執行緒安全下的 ArrayList 資料結構。
  • Swoole\Thread::getId() 獲取當前執行緒的 ID。
  • Swoole\Thread::getArguments() 獲取父執行緒傳遞給子執行緒的引數列表。
  • Swoole\Thread::join() 等待子執行緒退出,請注意 $thread 物件銷燬時會自動執行 join() ,這可能會導致程序阻塞。
  • Swoole\Thread::joinable() 檢測子執行緒是否已退出。
  • Swoole\Thread::detach() 使子執行緒獨立執行,不再需要 Thread::join()。
  • Swoole\Thread::HARDWARE_CONCURRENCY 硬體層支援的並行執行緒數量。
  • Swoole\Thread::$id 獲取子執行緒的 ID。
  • Swoole\Thread::exec() 開啟一個新的執行緒。

最後

自 Swoole 從 2012 年釋出第一個版本開始,就扛起了 PHP 領域非同步通訊的大旗,但這多年以來 Swoole 的發展也是實屬不易。還記得剛開始時的非同步回撥模式的套娃式程式設計方式,開發起來異常艱難,到後來的同步式程式設計,直接降低了PHP程式設計師的學習門檻,讓 PHP 在實時通訊、物聯網通訊、遊戲開發等領域也能大展拳腳,同時在 PHP 的發展史上也產生了重大的影響。

隨著 Go 語言在程式設計界的持續火熱,Swoole 常常被 PHP 程式設計師拿來和 Go 語言一決高下,總是被詬病 Swoole 無法有效利用多核 CPU、程序間的通訊困難等問題。話又說回來,Swoole 作為一個 PHP 的擴充套件程式和天生具有高效能的 Go 語言自然是不可比擬的,但 Swoole 也是在逐漸的向 Go 語言靠近,比如 Swoole 中也使用了「go、channel」關鍵詞來實現協程及通訊通道,雖說底層的實現機制還是大不相同的。

當然 Swoole 也在不斷地努力持續最佳化,就像將要推出的 v6 版本增加多執行緒的支援,來改變目前多程序的局面。至於這個版本對 PHP 發展來說有沒有很大的影響,我認為影響有限。但對 Swoole 的發展還是有很大的影響,畢竟以後再也不用受多程序的困擾了,這也是一大進步。

在 Web 領域作為世界上最好的語言,儘管 PHP 近年來的發展不盡如人意,但作為一名 PHPer 也有必要和有義務一起來維護和推動 PHP 生態的發展。


歡迎關注、分享、點贊、收藏、在看,我是微信公眾號「碼農先森」作者。

相關文章