在IIS7.5上使用PHP Mail()时,服务器的响应延迟很长 – 60到90秒

我们有一个在IIS 7.5上运行PHP 5.2.11的Windows 2008 Server

当服务器上的任何脚本调用一个mail()函数时,它不会显示错误,并且几乎立即发送电子邮件。 但是,服务器将“挂起”大约60到90秒,直到它开始将信息发送回浏览器。 如果mail()在前2分钟内没有被调用,这个延迟似乎更长。

我在Chrome开发人员工具“networking”标签中查看了这个问题,并且只是说整个这段时间都在等待。 一旦延迟结束,所有的信息被正确地发送到浏览器,并且页面正常呈现。

phpinfo()输出的潜在相关部分:

 Internal Sendmail Support for Windows - enabled sendmail_from - no value sendmail_path - no value SMTP - mail.samedomain.com smtp_port - 25 mail.force_extra_parameters - no value 

PHP邮件()开头的效率相当低, PHP手册本身说:

值得注意的是mail()函数不适合循环中的大量电子邮件。 此function打开和closures每个电子邮件的SMTP套接字,这不是很有效。

当消息的数量是1时不特别相关,但是还有另一个潜在的问题:

mail()的Windows实现在许多方面与Unix实现有所不同。 首先,它不使用本地二进制组合消息,而只使用直接套接字,这意味着需要在networking套接字(可以在本地主机或远程机器上)监听MTA。

因此,与Unix版本不同,它不能在本地守护进程中启动,它必须等待networking。

我不是一个编码器,但这显然是一个编码问题。 邮件function很可能期望从你的MTA得到一定的回应,而不是得到它,60秒听起来像是一个非常标准的超时值。 另外,您的前端UI代码不应该等待邮件(),这通常是后台进程。 不同步地做这件事并不困难。

总之,你可能可以在MTA级别修复这个问题(也许通过在IIS服务器上设置一个本地服务器),但这确实是一个编码问题。 build议你的开发者在性能很重要时不要使用mail(),而且在你等待的时候不要阻塞你的前端代码。