php不支持多線程的解決方法?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!
創(chuàng)新互聯(lián)公司是專業(yè)的順城網(wǎng)站建設(shè)公司,順城接單;提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行順城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
PHP 默認(rèn)并不支持多線程,要使用多線程需要安裝 pthread 擴(kuò)展,而要安裝 pthread 擴(kuò)展,必須使用 --enable-maintainer-zts 參數(shù)重新編譯 PHP,這個(gè)參數(shù)是指定編譯 PHP 時(shí)使用線程安全方式。
推薦:php服務(wù)器
線程安全
多線程是讓程序變得不安分的一個(gè)因素,在使用多線程之前,首先要考慮線程安全問(wèn)題:
線程安全:線程安全是編程中的術(shù)語(yǔ),指某個(gè)函數(shù)、函數(shù)庫(kù)在多線程環(huán)境中被調(diào)用時(shí),能夠正確地處理多個(gè)線程之間的共享變量,使程序功能正確完成。
在傳統(tǒng)多線程中,由于多個(gè)線程共享變量,所以可能會(huì)導(dǎo)致出現(xiàn)如下問(wèn)題:
存在一個(gè)全局?jǐn)?shù)組$arr = array('a');;
A線程獲取數(shù)組長(zhǎng)度為1;
B 線程獲取數(shù)組長(zhǎng)度為1;
A 線程 pop 出數(shù)組元素 $a = array_pop($arr); $a = 'a';;
B 線程也 pop 數(shù)組元素 $b = array_pop($arr); $a = null;;
此時(shí) B 線程內(nèi)就出現(xiàn)了靈異事件,明明數(shù)組長(zhǎng)度大于0,或沒(méi)有 pop 出東西;
PHP 實(shí)現(xiàn)
PHP 實(shí)現(xiàn)的線程安全主要是使用 TSRM 機(jī)制對(duì) 全局變量和靜態(tài)變量進(jìn)行了隔離,將全局變量和靜態(tài)變量 給每個(gè)線程都復(fù)制了一份,各線程使用的都是主線程的一個(gè)備份,從而避免了變量沖突,也就不會(huì)出現(xiàn)線程安全問(wèn)題。
PHP 對(duì)多線程的封裝保證了線程安全,程序員不用考慮對(duì)全局變量加各種鎖來(lái)避免讀寫(xiě)沖突了,同時(shí)也減少了出錯(cuò)的機(jī)會(huì),寫(xiě)出的代碼更加安全。
但由此導(dǎo)致的是,子線程一旦開(kāi)始運(yùn)行,主線程便無(wú)法再對(duì)子線程運(yùn)行細(xì)節(jié)進(jìn)行調(diào)整了,線程一定程度上失去了線程之間通過(guò)全局變量進(jìn)行消息傳遞的能力。
同時(shí) PHP 開(kāi)啟線程安全選項(xiàng)后,使用 TSRM 機(jī)制分配和使用變量時(shí)也會(huì)有額外的損耗,所以在不需要多線程的 PHP 環(huán)境中,使用 PHP 的 ZTS (非線程安全) 版本就好。
類和方法
PHP 將線程 封裝成了 Thread 類,線程的創(chuàng)建通過(guò)實(shí)例化一個(gè)線程對(duì)象來(lái)實(shí)現(xiàn),由于類的封裝性,變量的使用只能通過(guò)構(gòu)造函數(shù)傳入,而線程運(yùn)算結(jié)果也需要通過(guò)類變量傳出。
下面介紹幾個(gè)常用的 Thread 類方法:
run():此方法是一個(gè)抽象方法,每個(gè)線程都要實(shí)現(xiàn)此方法,線程開(kāi)始運(yùn)行后,此方法中的代碼會(huì)自動(dòng)執(zhí)行;
start():在主線程內(nèi)調(diào)用此方法以開(kāi)始運(yùn)行一個(gè)線程;
join():各個(gè)線程相對(duì)于主線程都是異步執(zhí)行,調(diào)用此方法會(huì)等待線程執(zhí)行結(jié)束;
kill():強(qiáng)制線程結(jié)束;
isRunning():返回線程的運(yùn)行狀態(tài),線程正在執(zhí)行run()方法的代碼時(shí)會(huì)返回 true;
因?yàn)榫€程安全的實(shí)現(xiàn),PHP 的多線程開(kāi)始運(yùn)行后,無(wú)法再通過(guò)共享內(nèi)存空間通信,線程也無(wú)法通過(guò)線程間通信復(fù)用,所以我認(rèn)為 PHP 的“線程池”并沒(méi)有什么意義。擴(kuò)展內(nèi)自帶的Pool 類是一個(gè)對(duì)多線程分配管理的類,這里也不再多介紹了。
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)php不支持多線程的解決方法大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。