我有一个托管在IIS 8.0上的Web应用程序/网站。该网站使用PHP 5.3编写,并使用PHP的odbc_connect()函数从与数据库的连接中获取数据。
在我网站上的两个页面上,必须向用户发送电子邮件,让他或她激活论坛帖子。我目前正在使用一种自制的SMTP方法,该方法使用fsockopen()发送电子邮件。
问题如下:
如果≈30分钟后,用户没有访问该网站,而他们访问了发送电子邮件的页面,则根据PHP的max_execution_time值,该页面将完全超时,没有数据发送到用户的浏览器(用户看到一个空白页面)。
尽管如此,电子邮件仍在发送,并且该页面上的每一位代码都在执行我怎么知道?我创建了一个日志文件,它在可疑页面的最后被写入,并且它总是被写入,即使页面超时。如果用户退出空白页面,再次提交电子邮件,它就会神奇地工作!
我尝试过的事情,没有改变一件事:
- 尝试使用PHP PEAR邮件
- 尝试使用PHPMailer
- 尝试使用PHP Swift Mailer
- 尝试使用flush()
- 尝试使用ob_flush()
- 尝试增加PHP的max_execution_time(这只会延长超时时间)
- 尝试使用stream_set_blocking()在fsockopen上使用非阻塞模式
- 尝试使用PHP 5.4/5.3/5.2
- 尝试设置error_reporting(E_ALL)
- 尝试设置ini_set("display_errors",1)
- 尝试设置ini_set("display_startup_errors",1)
空闲30分钟后,我得到的只是一个空白屏幕,没有错误消息。
有人有什么想法吗?记住,页面上的所有代码都会被执行,但它似乎从未停止"处理",直到超时。
示例代码:
<?php
include("functions.php"); //contains "smtp_mail" and "logwrite" functions
odbc_connect($connectionstring,$username,$password);
$mail = smtp_mail($recipient, $subject, $message);
echo "made it here"; //this never makes it to the user's browser!
logwrite("made it here"); //this is always executed, but still times out!
?>
事实证明,问题存在于我的主机端。我更换了主机,上面发布的代码运行良好。