0

我有一个表单上传,我将用户的输入添加到数据库中。作为该过程的一部分,我还向自己发送了一封电子邮件,其中包含一个文件的附件(用户上传的)。

代码结构非常简单:

//Establishing the $_POST[] vars
//Log them in DB
// Send out the email <-- This part adds 5 seconds to load time!!
//Redirect user to a success page

我向自己发送电子邮件的时间与用户点击“提交”和看到“成功”页面之间的加载时间相差 5 秒!!

发送电子邮件的代码如下所示:

$to = "test@test.com";
$subject = "new Image";
require_once('../api/class.phpmailer.php');
$mail = new PHPMailer(true); 
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host       = $smtp_host;
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = $smtp_host;
$mail->Port       = $smpt_port;
$mail->Username   = $smpt_email_username;
$mail->Password   = $smpt_email_pass;
$mail->AddAddress($to, '');
$mail->SetFrom($set_from_email, $set_from_name);
$mail->AddReplyTo($replyto_email, $replyto_name);
$mail->Subject = "new image";
$mail->AltBody = $mail_altbody;
$mail->AddEmbeddedImage('../uploads/'.$image, 't');
$mail->IsHTML(true);               
$mail->MsgHTML('<img src="cid:t" />');
$mail->Send();

我的问题是 - 是否可以异步发送电子邮件,因此它可以自行在服务器中进行,从而消除用户在发送电子邮件时等待额外时间的需要?

谢谢!

4

2 回答 2

0

1)您可以在数据库表中创建电子邮件队列,并使用 cron 作业从队列中发送所有电子邮件。Cron 作业可以每分钟运行一次。

2)您可以在非阻塞模式下直接创建另一个php进程。此过程使用 smtp 执行所有工作

shell_exec("nohup php /path/to/script.php arg1 arg2 arg3 > /dev/null & echo $!");

使用变量从命令行运行 php 脚本

于 2013-10-25T11:39:44.493 回答
0

可以使用 PHP Fork 模块。我认为它比 exec() 的用法要好一些。

PHP (>= 5.3) Pcntl fork: http ://php.net/manual/en/function.pcntl-fork.php

在发送邮件时,您的机器上仍然会有更高的负载,但它不再是相同的过程。那将是另一个PID。

于 2013-10-25T11:40:08.930 回答