php

PHP Non-Thread-Safe和Thread-Safe的区别

2023-07-30

从PHP5.2.10版本开始(现在有PHP5.2.10和5.3两个版本),有None-Thread Safe与Thread Safe两种版本的可供选择

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

        一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。

      为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。


      FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(搭配IIS)执行 PHP ,都建议下载执行 non-thread safe 的 PHP (PHP 的二进位档有两种包装方式:msi 、zip ,请下载 zip 套件)。


      而线程安全检查正是为ISAPI方式的PHP准备的,ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率。因为有许多php模块都不是线程安全的,以ISAPI来执行PHP,所以需要使用Thread Safe的PHP(搭配apache)。

如果你还搞不清楚,那么只需知道你是php+apache还是php+iis组合
non-thread-safe 非 线程安全与IIS搭配环境
thread-safe  线程安全 与apache搭配环境

PHP是用C语言开发的所以依赖VC库运行

Visual C++ 2003 运行库(VC7)

Visual C++ 2005 运行库(VC8)

Visual C++ 2008 运行库(VC9)

Visual C++ 2010 运行库(VC10)

Visual C++ 2012 运行库(VC11)

Visual C++ 2013 运行库(VC12)

只有安装了相应的运行库才能运行PHP,,如php5.5要求VC11的安装

php还有VC6 VC9版本区分,VC6和VC9一个支持apache一个支持IIS,VC9用在apache上也没问题,如果你用iis就必须用vc9的,如果你用apache vc6和vc9都可以用。

以上是转载自PHP5 non-thread-safe和thread-safe的区别的内容

总结一下:

在Windows下使用IIS和PHP,Fast CGI是单一线程进行操作的,就只有一个线程,所以不需要进行线程检查,为了减少系统资源消耗,因此要选择non-threead-safe

因为有很多PHP扩展不是线程安全的,如果使用ISAPI以多线程的方式,所以需要线程检查,使用thread-safe