防止PHP等待mail()函数
在我的web应用程序中,当用户更改其帐户时,我调用php mail()函数向该用户发送电子邮件通知。实施此操作后,我发现帐户更改操作需要花费大量时间(>20秒)才能完成。我怀疑这是因为PHP等待mail()函数发送电子邮件。是否有任何方法可以在不等待的情况下进行此调用并立即继续执行下一行代码 谢谢防止PHP等待mail()函数,php,email,apache2,Php,Email,Apache2,在我的web应用程序中,当用户更改其帐户时,我调用php mail()函数向该用户发送电子邮件通知。实施此操作后,我发现帐户更改操作需要花费大量时间(>20秒)才能完成。我怀疑这是因为PHP等待mail()函数发送电子邮件。是否有任何方法可以在不等待的情况下进行此调用并立即继续执行下一行代码 谢谢 Paul您可以将对mail函数的调用放在一个单独的php文件中,称为sendMail.php,然后使用(jQuery AJAX)将请求发送到函数[https://api.jquery.com/jQue
Paul您可以将对mail函数的调用放在一个单独的php文件中,称为sendMail.php,然后使用(jQuery AJAX)将请求发送到函数[https://api.jquery.com/jQuery.ajax/]
$.ajax({
type: "POST",
url: "sendMail.php",
data: { name: "Foo", email: "foobar@baz.com" }
})
.done(function( msg ) {
alert( "Email sent: " + msg );
});
创建另一个PHP脚本(本例中我们称之为“mailuser.PHP”)。在此文件中,您的代码将查找尚未通过电子邮件发送的激活帐户。。。然后发送电子邮件
在您的原始代码中(激活帐户后)呼叫:
这应该会产生进程,而不是等待它返回
有关更多信息,请参阅以下帖子:&
您还可以选择在命令行上传递用户id,这样mailuser.php就不必根据字段/标志查找用户。您可以发送Ajax调用以发送邮件,然后出于安全目的,如果邮件未发送,您可以调用数据库查询回滚,这样你的代码就安全了。我也有同样的问题。编写一个sendmail.php程序并使用ajax调用它
<?
session_start();
header("Content-Type: text/html; charset=iso-8859-1");
require_once("libreria/class.phpmailer.php");
$mail = new PHPMailer();
$body="";
$body.="<body>";
$body.=$_POST['cbody'];
$body.="</body>";
$mail->IsSMTP();
$mail->SMTPAuth = true;
//$mail->SMTPDebug = 2;
$mail->Host = "mail.xxx.xxx";
$mail->Port = 25;
$mail->Username = "usermail@xxx.xxx";
$mail->Password = "xxxxxx";
$mail->From = "usermail@xxx.xxx";
$mail->FromName = "xxx";
$mail->Subject = $_POST['subject'];
$mail->WordWrap = 50;
$mail->MsgHTML($body);
$mail->AddAddress($_POST['email'], "User");
$mail->IsHTML(true);
$mail->Send();
?>
(您可以使用ajax调用的响应来管理错误)。您怀疑吗?MonkeyZeus如果我对邮件函数的调用进行注释,服务器响应不到三秒钟。如果我允许它调用邮件函数,则需要20秒以上的时间。我认为可以肯定地说,邮件功能是罪魁祸首。有些地方出了问题。mail()函数的执行时间不应该太长。您可能需要尝试找出mail()函数花费这么长时间的原因。您的php.ini文件应该显示mail()函数正在使用的底层系统命令。应将其指定为sendmail_路径。如果您登录到服务器并通过指定为sendmail_路径的命令从命令行发送消息,执行是否需要约10秒?如果是这样的话,那么在您的服务器上运行MTA可能会有问题。在普通用户看来,即使没有
邮件()
,3秒钟的时间也太长了。您的网络中发生了一些事情,导致mail()
速度减慢,因此这一问题应该得到解决,但您确实需要考虑优化帐户更新过程。我不知道PHP有什么方法可以产生单独的函数,而不是等待它们,但在客户端,您肯定可以实现AJAX。@MonkeyZeus延迟三秒钟的原因是,所讨论的操作是通过信用卡支付订阅费。出于安全目的,我想保留此服务器端。已成功很好,谢谢。我想为任何尝试这样做的人补充一点,关于如何使用exec命令发送参数的更多信息可以在php手册中找到:没问题,乐意帮助=)
<?
session_start();
header("Content-Type: text/html; charset=iso-8859-1");
require_once("libreria/class.phpmailer.php");
$mail = new PHPMailer();
$body="";
$body.="<body>";
$body.=$_POST['cbody'];
$body.="</body>";
$mail->IsSMTP();
$mail->SMTPAuth = true;
//$mail->SMTPDebug = 2;
$mail->Host = "mail.xxx.xxx";
$mail->Port = 25;
$mail->Username = "usermail@xxx.xxx";
$mail->Password = "xxxxxx";
$mail->From = "usermail@xxx.xxx";
$mail->FromName = "xxx";
$mail->Subject = $_POST['subject'];
$mail->WordWrap = 50;
$mail->MsgHTML($body);
$mail->AddAddress($_POST['email'], "User");
$mail->IsHTML(true);
$mail->Send();
?>