SAPI、CGI、FastCGI、FPM 是什么?
SAPI(Server Application Programming Interface)是PHP与Web服务器或其他服务进行通信的一种接口。它定义了PHP如何接收来自Web服务器的请求,处理这些请求,并将结果返回给服务器。CGI、FastCGI、FPM是不同的SAPI实现方式,不同的SAPI为PHP提供了与不同类型的服务器集成的能力。
-
CGI (Common Gateway Interface): 是一种老式的标准,用于Web服务器与外部程序(如PHP解释器)之间的通信。对于每个HTTP请求,Web服务器都会启动一个新的CGI进程来处理请求,这导致性能低下,特别是当处理大量并发请求时。
-
FastCGI: 是CGI的一种改进版,旨在解决CGI性能问题。FastCGI允许长期运行的PHP进程池来处理请求,而不是为每个请求创建新进程。这样可以显著提高处理速度和资源利用率。
-
FPM (FastCGI Process Manager): 是FastCGI的一个实现,专为PHP设计。FPM提供了更好的进程管理功能,比如动态调整进程数量以适应不同的负载情况。它是现代Web服务器配置PHP的常用方式,支持Nginx、Apache等多种服务器。
如何将 PHP 连接到 Web 服务器?
-
与 Nginx 集成: 使用 FPM。需要在 Nginx 配置文件中指定 FPM 的 socket 文件或 IP 地址及端口。
location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 对于Unix Socket # 或 # fastcgi_pass 127.0.0.1:9000; # 对于TCP/IP fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
-
与 Apache 集成: 可以使用 mod_php(将PHP作为Apache模块直接嵌入),或者使用FastCGI(通过mod_proxy_fcgi与FPM通信)。
如何选择 PHP 的非线程安全(NTS)和线程安全(TS)版本?
-
线程安全(Thread Safe, TS): 在这个版本中,PHP引擎被编译时包含了对多线程环境的支持,确保了在多线程服务器(如某些Apache MPM模式)中脚本执行的安全性。如果你的Web服务器使用了多线程模型,应选择TS版本。
-
非线程安全(None Thread Safe, NTS): 如果你的Web服务器使用的是非多线程模型,如配合Nginx使用的PHP-FPM,那么可以选择NTS版本。NTS版本通常比TS版本执行效率稍高,因为不需要维护线程安全锁机制。
选择哪个版本主要取决于你的Web服务器配置和需求:
- 使用Nginx + PHP-FPM或使用Apache的mod_proxy_fcgi与FPM结合时,推荐使用NTS版本。
- 使用Apache配合apache2handler服务器API,则必须使用线程安全(Thread Safe, TS)版本的PHP。
- 如果在IIS中将PHP作为FastCGI使用,应该选择非线程安全(Non-Thread Safe, NTS)版本的PHP。