溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php不支持多線程的解決方法

發(fā)布時間:2020-08-11 14:27:39 來源:億速云 閱讀:114 作者:小新 欄目:編程語言

php不支持多線程的解決方法?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

PHP 默認(rèn)并不支持多線程,要使用多線程需要安裝 pthread 擴(kuò)展,而要安裝 pthread 擴(kuò)展,必須使用 --enable-maintainer-zts 參數(shù)重新編譯 PHP,這個參數(shù)是指定編譯 PHP 時使用線程安全方式。

推薦:php服務(wù)器

線程安全

多線程是讓程序變得不安分的一個因素,在使用多線程之前,首先要考慮線程安全問題:

線程安全:線程安全是編程中的術(shù)語,指某個函數(shù)、函數(shù)庫在多線程環(huán)境中被調(diào)用時,能夠正確地處理多個線程之間的共享變量,使程序功能正確完成。

在傳統(tǒng)多線程中,由于多個線程共享變量,所以可能會導(dǎo)致出現(xiàn)如下問題:

  1. 存在一個全局?jǐn)?shù)組$arr = array('a');;

  2. A線程獲取數(shù)組長度為1;

  3. B 線程獲取數(shù)組長度為1;

  4. A 線程 pop 出數(shù)組元素 $a = array_pop($arr); $a = 'a';;

  5. B 線程也 pop 數(shù)組元素 $b = array_pop($arr); $a = null;;

  6. 此時 B 線程內(nèi)就出現(xiàn)了靈異事件,明明數(shù)組長度大于0,或沒有 pop 出東西;

PHP 實現(xiàn)

PHP 實現(xiàn)的線程安全主要是使用 TSRM 機(jī)制對 全局變量和靜態(tài)變量進(jìn)行了隔離,將全局變量和靜態(tài)變量 給每個線程都復(fù)制了一份,各線程使用的都是主線程的一個備份,從而避免了變量沖突,也就不會出現(xiàn)線程安全問題。

PHP 對多線程的封裝保證了線程安全,程序員不用考慮對全局變量加各種鎖來避免讀寫沖突了,同時也減少了出錯的機(jī)會,寫出的代碼更加安全。

但由此導(dǎo)致的是,子線程一旦開始運(yùn)行,主線程便無法再對子線程運(yùn)行細(xì)節(jié)進(jìn)行調(diào)整了,線程一定程度上失去了線程之間通過全局變量進(jìn)行消息傳遞的能力。

同時 PHP 開啟線程安全選項后,使用 TSRM 機(jī)制分配和使用變量時也會有額外的損耗,所以在不需要多線程的 PHP 環(huán)境中,使用 PHP 的 ZTS (非線程安全) 版本就好。

類和方法

PHP 將線程 封裝成了 Thread 類,線程的創(chuàng)建通過實例化一個線程對象來實現(xiàn),由于類的封裝性,變量的使用只能通過構(gòu)造函數(shù)傳入,而線程運(yùn)算結(jié)果也需要通過類變量傳出。

下面介紹幾個常用的 Thread 類方法:

  • run():此方法是一個抽象方法,每個線程都要實現(xiàn)此方法,線程開始運(yùn)行后,此方法中的代碼會自動執(zhí)行;

  • start():在主線程內(nèi)調(diào)用此方法以開始運(yùn)行一個線程;

  • join():各個線程相對于主線程都是異步執(zhí)行,調(diào)用此方法會等待線程執(zhí)行結(jié)束;

  • kill():強(qiáng)制線程結(jié)束;

  • isRunning():返回線程的運(yùn)行狀態(tài),線程正在執(zhí)行run()方法的代碼時會返回 true;

因為線程安全的實現(xiàn),PHP 的多線程開始運(yùn)行后,無法再通過共享內(nèi)存空間通信,線程也無法通過線程間通信復(fù)用,所以我認(rèn)為 PHP 的“線程池”并沒有什么意義。擴(kuò)展內(nèi)自帶的Pool 類是一個對多線程分配管理的類,這里也不再多介紹了。

感謝各位的閱讀!看完上述內(nèi)容,你們對php不支持多線程的解決方法大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI