因为,Linux/Unix系统采用的是多进程的工作方式,而Windows系统采用多线程的工作方式.即:Linux系统的任务调度基本单位是进程,Windows系统的任务调度基本单位是线程(本观点来自自学与总结,不能保证百分之百正确).
所以,在Windows系统的IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程,且CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的.
于是,一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了.但存在一个问题,很多常用的PHP扩展是以 Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS.
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案.FastCGI可以让PHP的进程重复利用,而不是每一个新的请求就重开一个进程.同时FastCGI也可以允许几个进程同时执行.这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势.
所以呢,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(TS,线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率.
名词解析:
IIS:Internet Information Services (互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务
CGI:Common Gateway Interface (通用网关接口),是外部应用程序(CGI程序)与Web服务器之间的接口标准
ISAPI:Internet Server Application Programming Interface (互联网应用程序接口),是为Microsoft所提的Internet server的API
FastCGI:CGI存在收到每个请求时都开辟一个进程等不足,FastCGI可以理解为是征对CGI的改进版
先从字面意思上理解:
None-Thread Safe就是非线程安全,在执行时不进行线程(thread)安全检查;
Thread Safe就是线程安全,执行时会进行线程(thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式耗尽系统资源.
再来看PHP的两种执行方式:
ISAPI和FastCGI.
而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP.
Windows下的PHP版本分两种:线程安全版本与非线程安全版本.
要论两者的区别,详细论说起来比较麻烦,从使用者的角度,记住什么时候用哪种版本的区别就可以了吧:
①.、windows ◆ IIS ◆ FastCGI :使用非线程安全版本.
解释:
以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,不存在多个线程之间可能引发的相互干扰(这种干扰通常都是由于全局变量和静态变量导致的).由于省去了线程安全的检查,所以呢使用FastCGI方式比ISAPI方式的效率更高一些.
PHP以ISAPI方式安装时,PHP没有独立的进程,而是作为DLL被IIS加载运行的,即是依附于Web服务器进程的.当Web服务器运行在多线程模式下(IIS正是这种情况),PHP自然也就运行在多线程模式下.只要是在多线程模式下运行,就可能存在线程安全问题,所以呢应选择PHP的线程安全版本.
解释:
如果你要在Apache中以模块方式安装PHP,则你应该使用PHP的线程安全的版本.原因是当PHP作为Apache的模块安装时,PHP没有独立的进程,而是作为模块以DLL的形式被加载到Apache中的,是随Apache的启动而启动的,而Windows下的Apache为多线程工作模式,所以呢PHP自然也就运行在多线程模式下.所以呢,这种情况下应使用PHP的线程安全版本.
由于以ISAPI方式来安装PHP时,PHP也没有独立的进程,也是作为模块被加载到Apache中的,所以呢,同样也需要使用PHP的线程安全版本.
一般不建议在Apache中以ISAPI方式来安装PHP,原因是到目前为止,Apache通过mod_isapi.so模块来实现的ISAPI功能并不完整,并未完整实现微软对ISAPI所制定的全部规范.
如果你要在Apache中以FastCGI方式使用PHP,则同在IIS中使用FastCGI的PHP的情况一样,你应该使用PHP的非线程安全的版本.原因是在Apache中以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,故应使用PHP的非线程安全版本以提高性能.
以上资料总结相关资料,分条明细,供选择.
判断PHP 是线程安全还是非线程安全:
①通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版.
结果:Thread Safety = disabled 【disabled表示非线程安全】
如果没有grep命令(windows),那就一个个找吧.