
PHP 預設并不支援多線程,要使用多線程需要安裝 pthread 擴充,而要安裝 pthread 擴充,必須使用 --enable-maintainer-zts 參數重新編譯 PHP,這個參數是指定編譯 PHP 時使用線程安全方式。
線程安全
多線程是讓程式變得不安分的一個因素,在使用多線程之前,首先要考慮線程安全問題:
線程安全:線程安全是程式設計中的術語,指某個函數、函數庫在多線程環境中被調用時,能夠正确地處理多個線程之間的共享變量,使程式功能正确完成。
在傳統多線程中,由于多個線程共享變量,是以可能會導緻出現如下問題:
存在一個全局數組$arr = array('a');;
A線程擷取數組長度為1;
B 線程擷取數組長度為1;
A 線程 pop 出數組元素 $a = array_pop($arr); $a = 'a';;
B 線程也 pop 數組元素 $b = array_pop($arr); $a = null;;
此時 B 線程内就出現了靈異事件,明明數組長度大于0,或沒有 pop 出東西;
PHP 實作
PHP 實作的線程安全主要是使用 TSRM 機制對 全局變量和靜态變量進行了隔離,将全局變量和靜态變量 給每個線程都複制了一份,各線程使用的都是主線程的一個備份,進而避免了變量沖突,也就不會出現線程安全問題。
PHP 對多線程的封裝保證了線程安全,程式員不用考慮對全局變量加各種鎖來避免讀寫沖突了,同時也減少了出錯的機會,寫出的代碼更加安全。
但由此導緻的是,子線程一旦開始運作,主線程便無法再對子線程運作細節進行調整了,線程一定程度上失去了線程之間通過全局變量進行消息傳遞的能力。
同時 PHP 開啟線程安全選項後,使用 TSRM 機制配置設定和使用變量時也會有額外的損耗,是以在不需要多線程的 PHP 環境中,使用 PHP 的 ZTS (非線程安全) 版本就好。
類和方法
PHP 将線程 封裝成了 Thread 類,線程的建立通過執行個體化一個線程對象來實作,由于類的封裝性,變量的使用隻能通過構造函數傳入,而線程運算結果也需要通過類變量傳出。
下面介紹幾個常用的 Thread 類方法:
run():此方法是一個抽象方法,每個線程都要實作此方法,線程開始運作後,此方法中的代碼會自動執行;
start():在主線程内調用此方法以開始運作一個線程;
join():各個線程相對于主線程都是異步執行,調用此方法會等待線程執行結束;
kill():強制線程結束;
isRunning():傳回線程的運作狀态,線程正在執行run()方法的代碼時會傳回 true;
因為線程安全的實作,PHP 的多線程開始運作後,無法再通過共享記憶體空間通信,線程也無法通過線程間通信複用,是以我認為 PHP 的“線程池”并沒有什麼意義。擴充内自帶的Pool 類是一個對多線程配置設定管理的類,這裡也不再多介紹了。
以上就是php不支援多線程怎麼辦的詳細内容,更多請關注php交流群:
link