PHP NTS 配置是指非線程安全(Non-Thread Safe)配置,它與線程安全(Tread Safe)的配置不同,主要是在多線程環境中的應用。在 PHP 應用程序中,如果有多個線程同時運行,線程間共享進程和資源,這樣就會對系統的穩定性和安全性產生影響。因此,非線程安全的配置(NTS)就應運而生,它能夠有效地避免線程安全導致的相關問題。
在 PHP7 以后的版本中,NTS 和 TS 的區別變得更加明顯。在 PHP7 之前的版本中,NTS 和 TS 都是通過 compiler flag 進行編譯的。所以,當你打算使用 PHP7 以后的版本時,你需要明確你需要使用哪種編譯方式。如果你需要在多線程環境中運行 PHP 程序,則建議使用 NTS 配置。
NTS 的 PHP 版本與 TS 的 PHP 版本是不同的,而且在使用時也需要不同的擴展。如:安裝 Yaf 擴展時,在 NTS 和 TS 版本中,需要安裝不同的擴展文件。下面代碼是如何在 php.ini 文件中配置 PHP NTS 的方式。
extension_dir = "ext" ; Enable the extension you want to load, e.g: ; extension=php_exif.dll extension=php_opcache.dll extension=php_curl.dll extension=php_fileinfo.dll extension=php_gd2.dll ; extension=php_mbstring.dll extension=php_mysql.dll ; extension=php_mysqli.dll extension=php_pdo_mysql.dll extension=php_pdo_sqlite.dll extension=php_readline.dll extension=php_ldap.dll除此之外,NTS 的 PHP 程序還需要在執行時加載 zend_thread.sa 相關的擴展庫。如果你沒有做好擴展文件的準備,就會導致程序無法正常運行: Fatal error: Unable to start WinNT thread (-1) ... 如果你的程序正在運行 PHP 7.0 NTS 版本,并且在 web server 上使用 FastCGI,可以以以下方式設置: 在 Nginx 上,你需要將 PHP 運行的配置文件放到 conf.d/ 目錄下:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PHP_VALUE "zend_extension=\"C:/xampp/php/ext/php_opcache.dll\" opcache.enable_cli=0" #or use opcache.enable_cli=On }在 PHP-FPM 上,你需要修改 php.ini 文件,增加配置項如下, 然后開啟 PHP-FPM:
zend_extension = "C:\php\ext\php_opcache.dll" ;指定OPcache的擴展路徑。 opcache.enable = 1 ;whether to enable the opcache plugin opcache.enable_cli = 0 ;whether to enable the opcache plugin command line mode opcache.memory_consumption = 128 ;space reserved for opcache in bytes opcache.max_accelerated_files = 10000 ;number of files that can be cached in the accelerat總之,在 PHP 開發中,把 NTS 版本的 PHP 與 TS 版本混淆在一起是非常危險的。這會導致程序崩潰,因為某些線程能夠訪問另一個線程正在運行的代碼,從而導致不可預知的結果。簡單來說,NTS 編譯方式用于處理多線程環境,而 TS 編譯方式則用于處理單線程環境。