我在使用 IIS 和 PHP(加上一个 com dll)时遇到了一些问题。COM dll 经常崩溃,但我认为问题不是因为这个(我禁用了快速故障保护),因为 dll 总是崩溃,而问题开始于大约三周前,当时我们达到了大约 15.000 个用户/天。
发生的情况是所有 .php 文件突然停止响应,服务器只能提供静态 .htm 文件,这表明 php (php-cgi.exe) 存在问题。
这几乎总是发生在高峰时段(下午 3 点到 4 点到 5 点),此时谷歌分析显示 180-220 名“在线用户”。当这种情况发生时(我的意思是 PHP 吓坏了)我可以在服务器的任务管理器中看到,而不是通常 10-12 个 php-cgi.exe 进程,它们飙升至 30 或 40 个 php-cgi.exe 进程(约 30 MB RAM each) ,我猜这是因为 php-cgi.exe 停止处理请求。服务器共有 8GB RAM。
错误日志包括connection_abandoned_by_regqueue和connection_dropped,如果我不手动重新启动 IIS 或 defaultapppool,错误将大部分时间变成defaultapppool not available 503
一个问题是,在事件查看器中,我从未从 WAS 收到一条消息,表明 defaultapppool 已禁用,因此我可以将任务(重新启动池)附加到它,并且在 IIS 管理控制台中,我从未看到 defaultapppool 已禁用,尽管事实上它在日志中显示为禁用。
我一直在玩超时,但似乎从来没有做对。
我目前的理论是:
1) PHP 被许多用户(Windows、IIS)吓坏了,无法处理它
2).dll的崩溃导致很多用户在线时的麻烦
3) php+iis 兼容性在大批量时不是很好,尽管我不相信 15k/天的用户太多。不过我应该注意,大多数请求需要 50-300 毫秒才能完成。
php 版本是通过 WebPI 安装的 5.3.19,windows 版本是 windows 2008 R2 64bit。
出于某种奇怪的原因,notepad++ 以不可复制的十六进制形式在 httperr 日志中显示放弃/禁用查询的查询字符串(查询字符串为 UTF8 - 希腊语),而在普通日志中,查询字符串既可见又可复制。下面提供的屏幕截图。
我还提供了当前设置的第二个屏幕截图
HTTPERR 日志文件...错误从连接断开开始,然后稍后连接被放弃 http://img32.imageshack.us/img32/3796/9nkv.jpg
在第二个屏幕截图中是我当前的设置:1)启用 php 扩展,2)defaultapppool(网站运行的池)设置 3)php fastcgi 设置和 4)php 运行时限制。 http://img34.imageshack.us/img34/2531/o6d1.jpg
我今天的最后一个设置调整是每 3 分钟自动回收一次 defaultapppool 并禁用动态内容压缩。看看会怎样。
如果有人对解决方案有任何提示/想法,我将不胜感激!
先感谢您。