PHP是一門廣泛應用于Web開發的腳本語言,而編譯則是將源程序轉換成可執行程序的過程。PHP的編譯方式一般有兩種:ZTS(線程安全編譯模式)與NTS(非線程安全編譯模式)。
相較線程安全編譯模式,非線程安全編譯模式的優點在于效率更高。當然,使用時需要遵循一定的原則和要求。比如我們在編譯PHP時會使用configure指令,安裝一些需要的擴展等,如下:
./configure --enable-fpm --with-mysqli make make install
若要編譯為NTS,則只需在上文中的configure指令中加入" --disable-zts"選項,如下:
./configure --enable-fpm --with-mysqli --disable-zts
而一般的PHP安裝包,為了滿足更加廣泛的需求,通常是默認編譯為ZTS的。
下面我們來通過一個例子來更好地理解NTS編譯模式的用法。例如我們使用PHP來編寫一個非常簡單的程序:
<?php $a = 1; $b = 2; echo $a + $b; ?>
使用NTS編譯模式的PHP可在執行時省去線程鎖定和保護機制,從而提高程序執行效率,比如實際運行時間僅僅是使用ZTS編譯模式的一半有余。
在使用NTS編譯模式進行開發時,我們需要遵循以下的兩點建議:
1.禁用和線程模型、調試選項有關的所有擴展
雖然PHP提供了很多模塊,但其中一些是不能在非線程安全環境下使用的。這種時候,我們只需要在configure指令中加入" --disable-xxx"選項來禁用即可。比如下面這些擴展就不能在NTS下使用:
--enable-debug --with-tsrm-pthreads --enable-maintainer-zts --with-tsrm-st --with-apache2 --enable-mod-charset --enable-pthreads
2.使用PHP內置鎖定機制
在多線程環境下,為了保持數據的同步性和正確性,不同線程需要對共享變量進行增刪改查時,會使用鎖(Mutex),保證操作同一變量時不沖突。
<?php $mutex = new \Mutex('/mutex-test'); $mutex->lock(); $variable = $variable + 1; //必須要鎖 $mutex->unlock(); ?>
這里使用了PHP的一個內置鎖定類\mutex。在NTS模式下,可以用它來代替PHP提供的ZTS擴展。
總結來說,php的NTS編譯模式是為提高程序執行效率而推出的加速方式,但使用前需要注意一些特定的規則和限制,也需要仔細思考使用的擴展以及加鎖機制等等。