PHP运行到Windows上的几个弊端

Jan 21, 2010

PHP是Linux的原生服务,运行到Windows上究竟有什么不好呢?

尽管PHP是一个多平台语言,在Windows上运行PHP还是一个挑战。这是因为PHP是基于UNIX平台开发的,每个请求由一个不同的进程来处理。然 而在Windows平台下面,同一类型的请求是由同一进程的不同线程来处理的。这个区别意味运行着PHP的IIS的频繁崩溃。进一步来说,对这一问题的唯 一的解决方案就是把PHP运行在外部方式下(CGI)。最终导致PHP性能的降低。关键问题还是以下几点:

多线程:
PHP原生为多处理器环境(APACHE),因此最常用于LAMP (Linux, Apache, MySQL, PHP) 平台。windows的工作方式不同,web服务器,不管是iis还是apache都是多线程运行,即一个处理器上跑所有客户请求。为了使php在 多线服务器上跑的好,必须考虑线程安全的问题。如果线程安全处理失败,会导致php运行不稳定是当然的,同时是iis或apache崩溃的情况也经常发 生。还有更糟糕,一个崩溃的线程会导致整个web服务器挂掉,这也是为什么iis进程池会频繁的崩溃。相对于多进程环境,就算一个进程崩溃又有什么关系, 第web 服务器没有影响,下一个请求来的时候自动唤醒一个新的进程就可以了,就跟没发生过一样。时至今日,唯一防止php在windows上崩溃的做法还是把 php设置为外部CGI,但会比ISAPI慢很多。

CGI:
CGI表示 “通用网关接口”。CGI是一个联接平台,用于web服务器和web应用程序之前的对话连接,PHP就是CGI。CGI按照web服务器的应用标准被创 建,接口的好处是简单,更重要是和开发语言无关,而且相互直接是隔离的。这种隔离方式有效的阻止了崩溃程序错误引起的web服务器崩溃。要知道2003 sp2之前的asp程序错误会异常频繁引起整个web服务器崩溃,可想而知当时的主机商是生活在地狱中一样。CGI并都是好处,显著地缺点是-严重的拖慢 服务器性能。CGI 机制本身就包含了巨大的系统开销,为一个新的请求生成PHP进程的初始化工作最终导致了极端的性能地下,一个新进程的生成需要的内存分配和代码载入对于每 次http请求都要重复一次,而且请求结束后还会清理掉,对操作系统来说是严重的拖累。

本地web服务器模块:
为了解决CGI的性能问题,web服务器提供商会提供为web服务器提供API。知名的API包括netscape的NSAPI和MS的ISAPI. 这些API支持PHP跑在几个服务进程里面,每个处理进程处理一组请求,而不是一个,这样做能节约进程初始化的过多开销。API运行在单个处理器上,但不 是多线程的服务器。当部分PHP被修改成线程安全的,那线程安全版本绝不会比多进程版更稳定和高效。一个php中的一个小错,不管来自于一个模块调用,或 第三方库,都可能导致线程挂掉,并传播到整个服务器线程导致web 服务器停止。这点从IIS的进程池监控可以看出来,在LInux上并不需要这个监管程序。为此,在windows上使用本地服务模块或插件,不管是 apache还是iis,都被证明是不具备大规模的应用价值,常常会不可预期的出现崩溃,即使使用ISAPI模式。

by Xiaodu | Categories: 网站建设知识 | Tagged: , , |

No Responses so far | Have Your Say!

Leave a Feedback

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>