关于PHP的线程安全模式
PHP自身是不支持线程的,但是它在安装的时候,涉及到一个线程安全的问题,Windows下提供了二种安装包,Linux下编译安装提供了–enable-maintainer-zts这个选项。
很多人一看到“安全”,就以为是好事,其实不然。
既然PHP没有线程,那么这个线程安全指的是什么呢?这和它的运行方式有关。
这里仅对Linux系统下流行的两种PHP运行方式(LNMP和LNAMP)来讲一下。
如果是LNMP环境,也就是说PHP以php-fpm方式运行,那么就不涉及到线程安全这个问题了,因为php-fpm是以多进程的方式来运行的。
如果是以LNAMP或者LAMP方式运行(mod_php),那么应该先了解下Apache的MPM,简单点说,Apache支持以多线程的方式运行(Worker),也支持以多进程的方式运行(Prefork)。一般来讲,Linux下的Apache绝大多数都是运行在Prefork模式下,这是出于稳定性的考虑。
所以总结下,LNMP下不需线程安全,Apache下为了稳定性的考虑,建议以多进程的方式运行(Prefork),这样也是不需要线程安全的。
最后一点,PHP安装为线程安全,会比非线程安全多占用一些CPU,并且可能会增加bug或者不稳定的问题,这才是重点,不然PHP就没必要设置这个选项了。
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的'是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。
一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。
因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。
-
数据库设计和访问数据库的 PHP 代码中出现的五个常见问题
导语:您可以用很多的方式创建数据库设计、数据库访问和基于数据库的PHP业务逻辑代码,但最终一般以错误告终。本文说明了数据库设计和访问数据库的PHP代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们。问题1:直接使用MySQL一个常见问题是较老的PHP代码...
-
PHP学习入门的一些基础知识
导语:PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。下面我们来看看PHP学习入门的一些基础知识,希望对大家有所帮助。一,PHP脚本代码标记PHP的脚本是文件中一对特殊标记所包括的内容,如ASP是“”,PHP可看...
-
php统计数组元素个数的方法
PHP是一种HTML内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的.风格有类似于C语言,被广泛地运用。下面是小编为大家搜索整理的php统计数组元素个数的方法,希望大家能有所收获,更多精彩内容请及时关注我们应届毕业生考试网!count():对数组中的元...
-
PHP中用CURL伪造IP来源的方法
PHP中用CURL伪造IP来源的.方法,有需要的朋友可以看看。就跟随本站小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!1.文件复制代码代码如下:<?php$ch=curl_init();curl_setopt($ch,CURLOPT_URL,"http://localhost/");curl_setopt($ch,CURL...