pthreads 和 parallel 的創建者 Joe Watkins 在今年(2019 年)2 月宣布,由於架構缺陷,pthreads 將在 PHP 7.4 之後不再維護。
未來應該使用 parallel 來取代 pthreads。
公告
https://github.com/krakjoe/pthreads/issues/929#issue-410636734
pthreads 是一個物件導向的 API,它提供了 PHP 中多執行緒所需的所有工具。PHP 應用程式可以建立、讀取、寫入、執行以及與執行緒、工作者和執行緒物件同步。
此擴充功能已被視為未維護且已失效。
請考慮改用 parallel。
pthreads 擴充功能無法在網頁伺服器環境中使用。因此,PHP 中的多執行緒僅限於基於 CLI 的應用程式。
pthreads (v3) 僅能與 PHP 7.2 以上版本搭配使用:這是因為 ZTS 模式在 7.0 和 7.1 中不安全。
Threaded 類別構成了允許 pthreads 運作的功能基礎。它公開了同步方法和一些對程式設計師有用的介面。
Thread 類別允許透過簡單地繼承它並實作 run
方法來建立執行緒。任何成員都可以被任何擁有該執行緒參考的上下文讀寫。任何上下文也可以執行任何公開和受保護的方法。當從建立它的上下文呼叫實作的 Thread::start() 方法時,run 方法的主體將在一個單獨的執行緒中執行。只有建立執行緒的上下文才能啟動和加入它。
Worker 類別具有持續狀態,並且從呼叫 Thread::start()(繼承的方法)開始,直到物件超出範圍或被明確關閉(透過 Worker::shutdown())之前,它都將可用。任何具有 worker 物件參考的上下文都可以將任務堆疊到 Worker 上(透過 Worker::stack()),這些任務將由 worker 在一個單獨的執行緒中執行。worker 物件的 run
方法將在 worker 堆疊上的任何物件之前執行,允許初始化要執行的物件可能需要的資源。
Pool 類別用於建立一組 worker,以便在它們之間分配 Threaded 物件。這是 PHP 應用程式中使用多執行緒最簡單且最有效的方法。
Volatile 類別是 pthreads v3 的新功能。它用於表示 Threaded 類別的可變 Threaded 屬性(因為這些屬性現在預設為不可變)。它也用於在 Threaded 上下文中儲存 PHP 陣列。
同步是執行緒處理中的重要能力。pthreads 建立的所有物件都具有內建的同步機制(Java 程式設計師應該很熟悉),其形式為 Threaded::wait() 和 Threaded::notify()。在物件上呼叫 Threaded::wait() 將導致上下文等待另一個上下文在同一個物件上呼叫 Threaded::notify()。這種機制允許在 PHP 的 Threaded 物件之間進行強大的同步。
任何打算在應用程式多執行緒部分使用的物件都應該繼承 Threaded。
資料儲存:一般來說,任何可以序列化 (serialize) 的資料類型都可以作為 Threaded 物件的成員,並且可以從任何具有 Threaded 物件參考的上下文讀取和寫入。並非所有類型的資料都以序列化方式儲存,基本類型以其真實形式儲存。複雜類型、陣列和非 Threaded 物件則以序列化方式儲存;它們可以從任何具有參考的上下文讀取和寫入 Threaded 物件。除了 Threaded 物件之外,任何用於設定 Threaded 物件成員的參考都與 Threaded 物件中的參考分離;任何上下文只要有 Threaded 物件的參考,就可以隨時直接從 Threaded 物件讀取相同的資料。
靜態成員:當建立新的上下文(Thread 或 Worker)時,它們通常會被複製,但資源和具有內部狀態的物件會被設為 null(基於安全考量)。這允許它們作為一種執行緒區域儲存區的功能。例如,在啟動上下文時,如果一個類別的靜態成員包含資料庫伺服器的連線資訊和連線本身,則只會複製簡單的連線資訊,而不是連線本身。這允許新的上下文以與建立它的上下文相同的方式起始連線,並將連線儲存在相同的位置,而不會影響原始上下文。
當執行 `print_r`、`var_dump` 和其他物件除錯函式時,它們不包含遞迴保護。
注意事項:
資源:在 PHP 中定義資源的擴充功能和功能完全沒有準備好應對這種環境;pthreads 提供了在上下文之間共享資源的機制,然而,對於大多數類型的資源,這應該被認為是不安全的。在上下文之間共享資源時應格外謹慎小心。
在 pthreads 執行的環境中,為了提供穩定的環境,一些限制是必要的。
pthreads 和 parallel 的創建者 Joe Watkins 在今年(2019 年)2 月宣布,由於架構缺陷,pthreads 將在 PHP 7.4 之後不再維護。
未來應該使用 parallel 來取代 pthreads。
公告
https://github.com/krakjoe/pthreads/issues/929#issue-410636734