您好,欢迎访问一九零五行业门户网

PHP 线程安全

看到zend debuger有非线程安全的版本,才知道php推出了非线程安全的版本。而此前我对非线程安全一无所知:
另一篇文章好像说这个跟fastcgi有点关系。
这是一段文字,不过我没看明白:
php本身是线程安全的。一个服务进程可以安全地提供多请求线程的支持
一些扩展并不遵守
例如:线程安全的扩展中,全局变量的定义不是像普通c程序那样直接定义在函数之外,而是定义在宏zend_begin_module_globals和 zend_end_module_globals之间。需要zts(zend thread safe)支持的扩展需要包含tsrm.h头文件,并定义tsrmg宏值
在不支持线程安全的扩展中,仅是简单地认为一个服务进程同时只有一个请求在激活状态,不会出现冲突,那么全局变量可以简单地在rinit函数中初始化(rinit表示请求开始)并在rshutdown中注销:
code:php_rinit_function(ext)
{
   counter = 0;
}
php_function(ext)
{
   return_long(counter++);
}
这就是一个很简单的计数器。只要请求没有结束,每次调用ext,都会触发counter自增。
当在多线程环境中时,这个程序会发生严重的混乱,counter会变得飘忽不定,因为没有办法预测线程的触发和结束顺序及时间。这说明这个扩展并非线程级安全。
多线程,apache 1.3 和 apache 2.0
如 果您已经使用了 apache 和 php 一段时间了,那么您很可能见到过安装文档中的一个警告信息,它说“不要在生产环境中使用 apache 2.0.x 和 php,在 unix 和 windows 上都不行”。在 windows 系统上的 php 5.0.2 包中,这个警告信息可以在 install.txt 文件中的第 745 行找到。我们需要理解此处的这个问题是什么,这样就可以决定是否要使用 apache 2.0 或 ibm http server 2.0。
apache 2.0 可以配置为以两种方法运行:采用线程的和不采用线程的。当作为一个采用线程的服务器运行时,服务器中可以同时有多个线程都处于活动状态在执行,一次可以为 多个用户生成响应信息。通常,这样可以提高服务器的响应能力,使其更好地利用具有多个处理器的大型硬件。但是它同时也引入了一种风险。服务器调用的各个软 件层次必须在同时为多个用户调用时都能保证是安全的。尽管 web 服务器本身、php 解释器以及 php 扩展以这样调用都是安全的,但是有些 php 扩展会使用其他语言(例如 c 语言)编写的库,这些库并不全都是线程安全的。
在 apache web 页面上您可以找到一个有关这个问题的讨论,其中给出了一些建议,以及一种用来发现您的 php 扩展可能正在使用哪些 c 库以及哪些是线程安全的方法,请参阅参考资料部分。
在 实践中,很多人都会选择回避这个问题,而是采用下面的两种方法:要么以单线程模式使用 apache 2.0,要么使用 apache 1.3,它总是以单线程模式运行。虽然 apache 1.3 和 2.0 也有其他一些区别,例如 apache 2.0 可以支持 ipv6,但是到目前为止,二者之间最大的区别就是线程的问题,因此保留使用 apache 1.3 服务器并不像听起来一样是一种退化。
这 个问题在 ibm http server 中是怎样的呢?ibm 采用线程模式从 apache 2.0 中编译出了 ibm http server:这样速度更快,但却可能在使用非线程安全的扩展时是不安全的。由于 ibm 并没有同时发行源代码,而且选择采用线程和不采用线程的模式都是在编译时进行选择的,因此作为一个终端用户来说,您无法选择采用不使用线程的模式重新编译 ibm http server 2.0。不过在编写本文时,ibm 正在同时发行基于 2.0 和 1.3 版本的 ibm http server,这样您就可以选择使用单线程的基于 1.3 版本的服务器了
本文来自csdn博客,转载请标明出处:http://blog.csdn.net/mynameisyoudi/archive/2008/10/07/3029496.aspx
其它类似信息

推荐信息