在現(xiàn)代的網(wǎng)頁開發(fā)中,使用 PHP 腳本語言是非常常見的選擇,而集成 PHP 與 Linux 的開發(fā)環(huán)境更是最常見的開發(fā)方式。不過,對于一些涉及到多線程的 PHP 代碼,運行在多個線程之間可能會出現(xiàn)問題。這時候,我們就需要使用 PHP 的 ZTS 版本來解決這個問題。
PHP 線程安全性(TS)是個老生常談的問題。在沒有支持線程的 PHP 版本中,每一個進(jìn)程僅包含了一份全局變量,因此在多線程情況下使用 PHP 時,需要人工控制變量的訪問,不然就會造成變量賦值、讀取的混亂,對于開發(fā)者來說帶來無盡的麻煩。
而 ZTS 則提供了線程安全的實現(xiàn),允許多個線程可以同時執(zhí)行 PHP 代碼,各線程之間的數(shù)據(jù)互不影響,大大減輕了開發(fā)者的負(fù)擔(dān)。為了得到更好的執(zhí)行效果,最好能夠使用帶有 ZTS 支持的 PHP。
在 PHP 官網(wǎng)中,默認(rèn)提供的是 Non-ZTS 版本的 PHP,在 PHP 手冊中,我們可以找到 Zend Thread Safety,簡稱 ZTS。ZTS 版本的 PHP 不僅可以提供預(yù)編譯的動態(tài)擴展,更為重要的是,ZTS 版本支持多線程編程。指定使用 ZTS 時,PHP 核心頭文件中的宏定義會發(fā)生變化,會提供比 Non-ZTS 版本更多的線程安全的程序代碼以及高效的線程讀取和修改方式。
// 在 PHP Non-ZTS 版本下,每個進(jìn)程加載一遍某文件 include 'a.php'; // 在 PHP ZTS 版本下,每個線程加載一遍某文件 include_once 'a.php';
此外,PHP ZTS 版本的內(nèi)核代碼目錄中還具有 tsrm/ 目錄,而 tsrm 代表 "Thread Safe Resource Manager",意為線程安全資源管理器,主要它提供了線程鎖、線程 ID 和線程特定數(shù)據(jù)等功能。
值得一提的是,ZTS 版本的引入可以解決 PHP 代碼中的多線程問題,但是并不能解決 PHP 代碼的高并發(fā)問題。高并發(fā)可以考慮使用應(yīng)用服務(wù)器,比如 Nginx, Apache 等,或是使用消息隊列。
總而言之,對于需要使用多線程編程的 PHP 代碼,ZTS 版本是非常重要的選擇。使用 ZTS 版本可以使 PHP 代碼更加健壯、更加可擴展,也可以減輕開發(fā)者的負(fù)擔(dān)。