php non-thread-safe与thread-safe

一、如何选择PHP5.3的VC9版本和VC6版本

    VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。

    VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。

二、如何选择PHP5.3的Thread Safe和Non Thread Safe版本

    先从字面意思上理解,Thread Safe是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。Non Thread Safe是非线程安全,在执行时不进行线程(Thread)安全检查。

    再来看PHP的两种执行方式:ISAPI和FastCGI。

    ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;

    而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。

******************************************************************************************************************************

http://hi.baidu.com/celavi/blog/item/488e11df1852e91a6227980e.html/cmtid/6964a7efe99ecc1afcfa3c57

打开该页发现PHP 5.3有以下几个版本可供选择:

VC9 x86 Non Thread Safe

VC9 x86 Thread Safe

VC6 x86 Non Thread Safe

VC6 x86 Thread Safe

我装的web server是Apache 2.2.11,一开始下载了php-5.3.0-nts-Win32-VC9-x86(VC9 x86 Non Thread Safe),安装时的选项如下图:

php non-thread-safe与thread-safe - luguo.08 - 路过的人生

选择第二项Other CGI后安装完成,php不能在Apache中使用。

搜索到一篇文章:http://www.sitepoint.com/blogs/2009/07/07/install-php53-windows/

其中有一段说明了版本的选择:

General note:

Download the VC6 builds if you are using the standard Apache.org web server. The VC9 builds should be used for the Apache Lounge binaries or IIS.

A Thread Safe version should be used if you install PHP as an Apache module. The Non Thread Safe version should be used if you install PHP as a CGI binary.

因为我的Apache是标准(非Lounge)版本,所以应该下载PHP的VC6版本。因为是想安装成Apache Module,所以选择Thread Safe版本。也就是:VC6 x86 Thread Safe。

下载php-5.3.0-Win32-VC6-x86后安装,选项如下图:

php non-thread-safe与thread-safe - luguo.08 - 路过的人生

有了Apache 2.2.x Module的选项。

**********************************************************************************************************************************

一、FastCGI是什么?

  FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。

    FastCGI的官方站点在http://www.fastcgi.com

  FastCGI的工作原理是:

  1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);

  2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

  3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。

  4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。

  在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

—————————————————————————————————————————-

自从用上了PHP5.3,问题还真是多,自上次出现连接MS SQL Server的问题后,这次在安装 Zend Debugger时又出现了问题。按照Zend官方给出的Zend Debugger安装步骤,从 这里 下载了最新的 5.2版本的Studio Web Debugger,从解压出的ZendDebugger-v5.2-cygwin_nt-i386\5_3_x_nts_comp目录中复制ZendDebugger.dll 到PHP安装文件夹下的ext目录,然后编辑php.ini文件,在文件最后加入一下三行:

zend_extension = “d:/php/ext/ZendDebugger.dll”
zend_debugger.allow_hosts= 127.0.0.1
zend_debugger.expose_remotely=always

然后把dummy.php文件复制到apached的 “DocumentRoot”目录(在http.conf文件中设定),可重启Apache服务后 用phpinfo()显示的页面中并没有Zend Debugger,很明显,安装没有成功。

回过头再仔细看Zend的安装步骤介绍,发现zend_extension这项配置有两种,除了zend_extension以外,还有设置为zend_extension_ts的,分别适用于Non-Thread-Safe和Thread-Safe版的PHP,而我安装的PHP是Thread-Safe版的(通过phpinfo() 页面的Thread Safety选项可以查看到),所以应该用zend_extension_ts,但是我下载的Studio Web Debugger 针对php 5.3版的只有nts版的ZendDebugger.dll (从文件夹名称可以看出-5_3_x_nts_comp).

仔细搜了一下,终于找到了答案,在Zend 论坛里一位Zend 员工明确地回复:”目前还没有针对 Thread-Safe 的PHP 5.3发布相应的Zend Debugger的计划”,这个帖子 里,另一位Zend员工针对用户在Thread Safe 版PHP 5.3 安装 Zend Debugger失败的原因做了更详细的解释:

Zend stopped supporting the thread safe architecture when Microsoft also decided to implement its PHP engine with the fast-cgi architecture which means non-thread-safe.

他建议用户用安装Zend Server(目前已经支持PHP 5.3)–  Zend Server包含的是Non Thread Safe 版的PHP.

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s