Login
网站首页 > 文章中心 > 其它

php线程安全和不安全_线程安全与线程不安全

作者:小编 更新时间:2023-10-07 07:29:29 浏览量:367人看过

PHP线程安全与非线程安全的区别:如何选择用哪一个

因为,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的改进版

php5 NTS和TS版本的区别,所谓的线程安全和非安全

先从字面意思上理解:

None-Thread Safe就是非线程安全,在执行时不进行线程(thread)安全检查;

Thread Safe就是线程安全,执行时会进行线程(thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式耗尽系统资源.

再来看PHP的两种执行方式:

ISAPI和FastCGI.

而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP.

Windows下的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 是线程安全还是非线程安全的

判断PHP 是线程安全还是非线程安全:

①通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版.

结果:Thread Safety = disabled 【disabled表示非线程安全】

如果没有grep命令(windows),那就一个个找吧.

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章