PHP是一種流行的編程語(yǔ)言。其最新版本7.4中對(duì)并發(fā)的支持得到了重視。PHP默認(rèn)情況下使用ZTS。(Zend Thread Safety),因?yàn)镻HP使用線程而不是進(jìn)程,因此必須開啟Zend Thread Safety。不過(guò),在某些情況下,關(guān)閉ZTS可能更有利。
ZTS在為PHP解釋引擎加入并發(fā)支持方面確實(shí)非常有用。但它也有一些副作用。在關(guān)閉ZTS時(shí),可能會(huì)降低服務(wù)器資源的使用。同時(shí),關(guān)閉ZTS也可以加快程序的運(yùn)行速度。
如果你的PHP程序使用I/O密集型操作而不涉及CPU密集型任務(wù),那么關(guān)閉ZTS是可行的。在I/O操作中,CPU傳輸?shù)臅r(shí)間非常有限,而等待I/O操作完成的時(shí)間相對(duì)較長(zhǎng)。這就意味著當(dāng)I/O事件發(fā)生時(shí),CPU會(huì)讓位,讓未使用的工作線程運(yùn)行。這樣做是為了避免CPU線程長(zhǎng)時(shí)間等待,從而浪費(fèi)資源。但是,關(guān)閉ZTS并不一定意味著降低服務(wù)器的安全性。
PHP從來(lái)都不建議你關(guān)閉ZTS。如果你必須關(guān)閉ZTS,并且你的PHP程序使用了某些擴(kuò)展,比如Zend OPcache,那么你需要跟蹤這些擴(kuò)展的指令。當(dāng)你關(guān)閉ZTS時(shí),有一些擴(kuò)展的指令可能會(huì)產(chǎn)生錯(cuò)誤,這是因?yàn)樗鼈冃枰€程安全性保證。
//關(guān)閉ZTS的設(shè)置 configure_options = --disable-maintainer-zts
在PHP中,多線程同時(shí)運(yùn)行時(shí),會(huì)出現(xiàn)許多第三方擴(kuò)展的問(wèn)題,比如未定義的背景線程、變量溢出等。因此,在計(jì)算密集型任務(wù)上要關(guān)閉ZTS是不合適的。
總的來(lái)說(shuō),如果你不確定是否要關(guān)閉ZTS,最好還是堅(jiān)持原則,不要輕易關(guān)閉它。在一些較為簡(jiǎn)單的PHP代碼中,關(guān)閉ZTS可以提供性能的一定提升。但是,當(dāng)面臨著大數(shù)據(jù)量的復(fù)雜程序時(shí),不要輕易關(guān)閉ZTS,因?yàn)檫@并不能優(yōu)化程序的性能。因此,在是否關(guān)閉ZTS時(shí)要權(quán)衡利弊。