这里是普通文章模块栏目内容页
PHP安装包TS和NTS的区别

phpinfo();

打印环境查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全如果是:enabled,一般来说应该是ts版,否则是nts版。

PHP的TS和NTS版本

TS(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。好处是不会出现数据不一致或者数据污染的情况,但耗费的时间要比 NTS 长。

PHP以 ISAPI 方式加载的时候选择TS版本。

TS:有php7apache2_4.dll文件

NTS(None-Thread Safe)即非线程安全,就是不提供数据访问保护,有可能出现多个线程先后或同时操作同一数据的情况,容易造成数据错乱(即脏数据),一般操作的执行时间要比 TS 短。

php以fast-cgi方式运行的时候选择NTS版本,具有更好的性能。

NTS:没有php7apache2_4.dll文件

TS和NTS版本的选择

php在windows下分为TS版和NTS版

Linux上的PHP同样有NTS和TS版本的区别,默认是NTS版本,configure时加上–enable-maintainer-zts则编译为TS版本

什么时候需要TS版本呢?

比如你要使用pthreads这个多线程的PECL扩展时,

或者PHP以MOD_PHP嵌入多线程运行下的Apache,

比如Apache在Linux上提供的Event MPM就是一个多进程多线程的工作模型,Windows上Apache采用的WinNT MPM也是一个多线程模型,这时都需要TS版本的PHP.

而如果以PHP-FPM(比如搭配Nginx或者Apache的mod_fastcgi)

或者PHP-CGI(比如搭配Apache的mod_fcgid或者Win上的IIS)来运行PHP,则一般都不需要TS线程安全版本的PHP.

以 FAST-CGI 或 PHP-FPM 方式运行就用NTS 非线程安全版

在windows系统下

Apache + PHP 组合,以 ISAPI 的方式运行。用 TS 线程安全版

若IIS,以isapi模式运行PHP使用TS版,以FastCGI模式运行PHP使用NTS版
  

在linux系统下

Apache + PHP,PHP一般作为Apache 的模块进行运行 选TS

Nginx + PHP ,(以php-fpm的方式运行)选NTS

PHP的运行模式

  1. CGI (通用网关接口/Common Gateway Interface)

它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。

  1. FAST CGI (常驻型CGI / Long-Live CGI)

fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

补充:

FAST-CGI 是微软为了解决 CGI 解释器的不足而提出改进方案。当一个请求向 web server 发送请求时,web server总会fork一个CGI解释器进程进行处理这个请求,进程处理完成之后将结果返回给web server,web server将结果返回并显示出来,进程结束,当用户再次请求同一个页面时,web server又会fork一个新进程进行请求处理,这样效率会比较低下(CGI被人诟病的主要原因)。而采用FAST-CGI 解释器的 话,当一个请求执行完毕后不会注销该进程,而是将改进程进入休眠期,当接收到新的请求时,重新启用改进程进行处理。FAST-CGI 较CGI 减少了进程的重复创建的资源占用。

  1. CLI(命令行运行 / Command Line Interface)

PHP-CLI是PHP Command Line Interface的简称,如同它名字的意思,就是PHP在命令行运行的接口,区别于在Web服务器上运行的PHP环境(PHP-CGI,ISAPI等)。

也就是说,PHP不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI Shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端,在Windows和Linux下都是支持PHP-CLI模式的。

  1. 模块模式

模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。

除了这种启动时的加载方式,Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译,甚至根本不需要停止服务器。我们所需要做的仅仅是给服务器发送信号HUP或者AP_SIG_GRACEFUL通知服务器重新载入模块。但是在动态加载之前,我们需要将模块编译成为动态链接库。此时的动态加载就是加载动态链接库。 Apache中对动态链接库的处理是通过模块mod_so来完成的,因此mod_so模块不能被动态加载,它只能被静态编译进Apache的核心。这意味着它是随着Apache一起启动的。

  1. ISAPI(Internet Server Application Programming Interface)

通常是指被http服务器所加载,以服务器的模块形式运行,由微软提出,故只能在win平台上运行,

例如win下的apache,iis

ISAPI(Internet Server Application Program Interface)是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境)

PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。


PHP-FPM是什么 (php-Fastcgi Process Manager 进程管理器)

php-fpm 是 FastCGI 的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

栏目索引
相关内容