ZTS(Zend Thread Safety)
ZTS(Zend Thread Safety)
ZTS(Zend Thread Safety)是 PHP 的編譯選項(--enable-zts):開啟之後,PHP 把每個請求的狀態放在各執行緒自己的儲存區,而不是全域變數裡,多個執行緒才能同時執行 PHP 而不互相覆寫。沒有開 ZTS 的版本叫 NTS(Non Thread Safe)。可先對照 mod_php 與 SAPI。
概念位置
ZTS 決定 PHP 能不能住在一個多執行緒的程序裡。PHP 跑在獨立程序裡的執行方式(CGI、PHP-FPM)不需要它,每個 worker 一次只處理一個請求;PHP 嵌在多執行緒伺服器裡時需要它:mod_php 要搭配 Apache 的 worker 或 event MPM、FrankenPHP 用執行緒當 worker。
可觀察訊號與例子
php -i | grep "Thread Safety":php:8.5-apache與php:8.5-fpm-alpine是disabled,FrankenPHP 映像檔是enabled。- mod_php 只能用 prefork:PHP 官方安裝文件寫明,除非以
--enable-zts編譯,mod_php 需要 prefork MPM。 - 擴充也要支援:PHP 能以執行緒安全的方式執行,不代表每個擴充與它依賴的 C 函式庫都能。
設計責任
選執行模型時,ZTS 是前提條件之一:要讓 Apache 用執行緒、或採用 FrankenPHP,就要拿到 ZTS 版的 PHP 與相容的擴充。不需要執行緒時,NTS 版本較常見、擴充相容性也較好。