关于FastCGI的网友通信

zealy 在 周一, 2006-03-20 13:58 提交      电脑

  日前有网友发邮件探讨FastCGI的有关问题,整理了一下,觉得还是有些价值,征得对方同意后,发在这里,以飨来者。

back dream:

想问你个问题: 使用IIS+FastCGI,php+EA,一直以来被一个问题困扰着,就是客户端经常出现“The application called an interface that was marshalled for a different thread. ”换成CGI模式就没有此问题。 不知道是什么原因,如何解决? 如果可以,给我发电子邮件好吗?

Zealy:

你好,看到你在blogme.cn的留言。
不一定能够解决你的问题,因为这个问题我也没碰到过。
不过,你可否告诉我如下信息,我看能不能帮上你:
1、IIS是5还是6,如何配置的
2、FastCGI的版本或下载的地址
3、php版本和php.ini的内容
4、EA的版本

back dream:

谢谢回复。你难道没有碰到过这种情况,奇怪了,我经常碰到。
1、IIS是6,现在运行在5的应用程序保护模式下,配置方法和5一样。
2、fastcgi是那个0.6版本的,好像还是02年出来的那个。
3、php和EA都是现在最新的,4.4.2和0.94。
谢谢。
 
php的一些信息:
PHP Version 4.4.2

System  Windows NT SA_DSRV1 5.2 build 3790 
Build Date  Jan 13 2006 13:49:27 
Server API  CGI/FastCGI 
Virtual Directory Support  enabled 
Configuration File (php.ini) Path  d:\php\php.ini 
PHP API  20020918 
PHP Extension  20020429 
Zend Extension  20050606 
Debug Build  no 
Zend Memory Manager  enabled 
Thread Safety  enabled 
Registered PHP Streams  php, http, ftp, compress.zlib 

This program makes use of the Zend Scripting Language Engine:
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies with eAccelerator v0.9.4, Copyright (c) 2004-2005 eAccelerator, by eAccelerator 

Zealy:

从你的提示来看,估计是IIS线程管理和PHP线程管理之间有问题。在IIS Isapi下我倒是经常碰到AV问题,据说这是微软isapi接口的问题,但不知道为什么php有时候就是不好用。
我的一些建议,你尝试一下:
1、在IIS管理器中将网站的"应用程序配置"里的"启用缓冲"项去掉。
2、在IIS管理器中禁止"Active Server Pages"扩展,据说这个asp.dll和php的isapi dll有冲突。
3、在IIS管理器中将网站的应用程序安全性设为低。
4、fastcgi的这个版本是可以用的。直到我用的iis 6 + php 5.1.1.1,仍然表现稳定,甚至比apache下的fastcgi还稳定,只是参数少了点。
5、你的php和zend似乎都不是最新版本。你可以尝试一下新的版本。最新的php4版本在http://snaps.php.net/win32/php4-win32-STABLE-latest.zip,如果可能建议使用php5。如果尝试新版本,请确定老的dll已经从你的硬盘上删除。zend方面的信息我的是:
Zend Engine v2.1.0, Copyright (c) 1998-2005 Zend Technologies
    with eAccelerator v0.9.4-rc1, Copyright (c) 2004-2005 eAccelerator, by eAccelerator
    with Zend Extension Manager v1.0.9, Copyright (c) 2003-2006, by Zend Technologies
    with Zend Optimizer v2.6.2, Copyright (c) 1998-2006, by Zend Technologies
就是同一个zend 2.6版本,我之前从zend网站上下载的存在报错的问题,后来停用就好啦,然后隔了一两个月又下了这个2.6.2就没问题了。
你不妨尝试一下不使用zend或换zend的较新版本。
6、还有,不知道在php.ini中你有没有使用auto_prepend_file配置项,这个最好不要使用。
7、尽量不使用不必要的php扩展。

back dream:

好详细呀。在家里,暂时没法现在测试,但关于前两点,我并没有使用PHP的ISAPI模式啊,怎么会有冲突?
 
终于找到能正常使用IIS fastcgi的同志了,这个问题困扰了我很长时间,最后不得不换成CGI方式,真痛苦啊。
 
另外,我看EA的文档0.94版本好像不支持php 5.1,0.95开发版才支持,你居然能很稳定地用起来?

现在我把启用缓冲去掉,程序保护级别设置为低。好像出错的几率很小。但是不管怎么设置,还有个问题,就是页面响应时间非常长。开始可能访问的人少还好,过一段时间,访问量上来后,发现打开一个页面需要很长时间。但是查看页面最下的执行时间,有非常少,一般只在几十毫秒内。
 
你遇到这种情况吗?
 
因为程序需要,我启动了mb_string、exif、GD等几个常用的扩展而已。

Zealy:

这问题和IIS的线程管理模型有关吧,这个我可说不上来。我用的EA 0.94rc1没问题,我并没有看文档,呵呵,但它确实提升了速度并且没什么问题。

我以前碰到的页面执行时间长的问题主要是两方面:
1、数据库设置问题,使得数据库反应缓慢。
2、因为通常数据库服务器和web服务器分开,二者之间的网络质量原因也会造成页面响应时间非常长。
不知道你是跑哪种类型的应用?建议先检查网络,再查设置。或者在把应用系统集中到本机进行压力测试,这样可以排除网络方面的原因。

back dream:

我粗略查了下,应该是把应用程序保护设置为低的原因吧,程序显示的执行时间很少,说明php响应正常,也不会是数据库的问题,只是php把输出交到IIS的时候IIS响应不过来了。应用程序保护设置为低后,IIS在任务管理器里面占用内存三五百兆,不知道你那里怎样……
另外,你好像试用IIS6,那里好像没有应用程序保护吧,只是分一个个应用程序池,不知道你的设置是什么样的,能否详细说说。

Zealy:

我在IIS 6下用程序池或改用iis 5隔离模式都没有你这样的响应问题,感觉是一样的。程序池模式folk出来的w3wp进程占不了多少内存,主要是fastcgi起的php-cgi占内存多,一个7-30兆之间。
我的设置是程序池1200分钟、15000次,500兆虚拟内存、192兆内存回收工作进程。最大工作进程数为1,这个比较重要,否则fastcgi的调度可能会乱套。回收设置更长期也是可以的,而且可能还好一点,因为回收时需要一点反应时间,用户感受不好。在我这里isapi模式比fastcgi模式快,省内存一些,但是不是很稳定,时不时AV,所以我用的fastcgi。
不知道你为什么不用程序池模式?难道是win2000系统。程序池模式要安全些,可以指定工作进程的账户,这样iis工作进程和php-cgi就不用运行在Network Services之类的账户上了。

back dream:

我服务器还有其他应用程序要跑,比如ASP,最主要还是domino,它也使用ISAPI,而且必须把应用程序保护设置为低。设置为低后所有进程都跑在inetinfo.exe进程里面,如果一个应用程序有问题,那这个进程好像就会死掉……IIS6模式我也试过,忘记当初为什么又改回IIS5模式了。找时间再测试测试。
 
你说的最大工作进程数为1倒挺有意思,我好像没试过。有多个目录需要设置应用程序,你是否把所有运行php的目录设置到一个应用程序池里面,然后把这个应用程序池工作进程设置为1?
 
在IIS5模式下,你是把整个站点设置为应用程序保护低还是对每个虚拟目录设置不同的应用程序保护?

另外,还有个问题,使用fastcgi后如果想重启iis服务,php好像并不停止运行,我每次得手工一个个关闭php进程。你有什么好方法?还是不需要关闭php进程?

Zealy:

这个说明你的fastcgi进程管理有问题,如果有多个工作进程使用fastcgi启动php-cgi,fastcgi关闭时似乎就不能正确的关闭php-cgi。因此在我这里我发现应用程序池保持工作进程为1可以避免这个问题;我这里可以正确关闭。如果你不能正确关闭php,那你改为程序池模式时恐怕也不能正确回收。我只有一个php应用在IIS下跑,其他跑在apache下;如果有多个应用我想恐怕只能都设置在一个应用程序池里,否则很可能不能正确回收的。其实就算是设在一个程序池里也没关系呀,实际上进程调度是由fastcgi完成的,iis程序池负责回收和fail-over,我觉得完全是能满足要求的——前提是应用都是产品级的,不是那种经常出错搞死php的。
 
另外,IIS5模式下究竟应该设整个保护低还是分目录设,这个我没什么研究,呵呵。

back dream:

我正在配置IIS6,不知道你所说的"最大工作进程数为1",是设置哪里?能给个抓图吗?一个是"request queue limit"的kernel request queue那里,默认为不选,数目为2000,一个是web garden的max number of worker processes,默认选中数字为1。


中午设置成iis6的应用程序模式,把php应用程序放在一个程序池,到现在好像没有错误产生,需要更长时间的考验。php所在的那个进程内存占用了300多兆,不知道你是否这样?回收时间我用默认1740分钟,我明天看看能否正常回收。你有没有设置错误检测方面的选项?

Zealy:

web garden的max number of worker processes

"php所在的那个进程内存占用了300多兆", 你是用的ISAPI方式了吧,这个内存量与你的应用复杂度和网站繁忙程度有关。如果是cgi方式,我的php-cgi.exe每进程好像最大也没超过30兆。感觉错误监测如快速失败保护什么的对php没有用。

back dream:

是使用的fastcgi模式的,那个进程w3wp.exe应该是应用程序池所占用的空间,但是我不知道哪个是哪个,我想多半是php那个应用程序池占用的吧。快速失败保护没用,回收在你那里是否正常,是否程序池确实回收并重新启动啦?
 
非常感谢,在你的帮助下,我终于成功在windows下使用fastcgi啦,从这一天的情况来看,虽然速度没有想像中的快,离zeus下还有很大距离,但是比以前的cgi方式占用资源小多啦,而且非常稳定。

Zealy:

我这里回收正常,确实回收并重起了php-cgi.exe。
 
不用谢,一点小忙而已。回头我整理一下,把FastCGI有关内容的对话发到blog上,你不介意吧?

back dream:

没关系,这方面的资料确实太少,很高兴你的分享。

此内容的Trackback地址:

http://blogme.cn/trackback/6574

十年、十年又十年 | 发表评论 | 打印版本 | 已被阅读126310次


关于 zealy

zealy
zealy 的图片

用户登录

导航

zealy 的存档

« 三月 2010  
周一 周二 周三 周四 周五 周六 周日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

zealy 的聚合

RSS 2.0
XML feed
ATOM 0.3
XML feed