PHPMailer在从Gmail帐户发送电子邮件方面表现出色。但是它需要相当长的时间,直到邮件被发送后页面才会显示响应。有什么办法可以在后台发送电子邮件,以便我可以为用户提供更好的用户体验?谢谢!
PHPMailer在从Gmail帐户发送电子邮件方面表现出色。但是它需要相当长的时间,直到邮件被发送后页面才会显示响应。有什么办法可以在后台发送电子邮件,以便我可以为用户提供更好的用户体验?谢谢!
它会在需要时触发(避免使用CRON),因为它被调用为后台运行,所以速度很快,立即生效。
1. 电子邮件队列。 使用插入语句获取MySQL表中的所有字段,例如:
$queryIN="INSERT INTO email_queue (date,subject,body,destination,idle) values (...)";
mysql_query($queryIN);
这很重要,因为您需要一个独立的后台进程,所以建议注册和审计所有发出的电子邮件。
2. PHP exec()。在将内容插入MySQL之后,是时候调用外部执行:
exec("wget -qO- http://example.com/index.php?process_email_queue=1 &> /dev/null &");
-q0-
和&> ... /dev/null &
来抑制输出并作为后台进程调用。3. 用于处理队列调用的相同脚本文件index.php或其他:
这种方式会调用我们的index.php(您可以使用其他文件名),并处理外发:
if ($_GET['process_email_queue']==1) { ...code for sending idle emails queue... }
也许你需要调整一些php.ini选项来使用exec()
,这并不是什么大问题。
一旦一切运行正常,您将提供更好的网络导航和电子邮件处理,以获得快速响应和零等待时间。
在某些情况下,您将从等待直接电子邮件2.60秒变为队列执行后台任务0.024秒,这意味着速度提高了11倍。
<?php
class AsyncEmail extends Thread {
public function __construct($arg){
$this->arg = $arg;
}
public function run() {
/** Add your email sending code here. **/
}
}
// and call this following lines in loop
$aEmail = new AsyncEmail( $arg );
var_dump($aEmail->start());
?>
它使用了php的Thread和PECL pthreads
库。
请注意,为您的Apache环境设置PECL
是最棘手的部分。
此外,在同一篇文章中,人们建议为这些要求设置corn jobs,但这完全取决于您的要求。您可以:
你可以使用exec
命令告诉PHP CLI解释器在后台运行你的脚本。
如果你在Linux系统上:
exec("/path/to/php /path/to/your/mailer/script \"arg1\" \"arg2\" \"arg3\" \"arg4\" > /dev/null 2> /dev/null &");
如果你使用的是Windows操作系统:
pclose(popen("start /B /path/to/php /path/to/php/script \"arg1\" \"arg2\" \"arg3\" \"arg4\"","r"));
get_cwd()
来查找。有许多像Beanstalkd、GearMan等后台处理软件...
我建议使用beanstalkd,因为它非常轻量级和简单。易于创建作业并传递到队列(在他们的术语中称为Tube)。
需要一个额外的工作程序,继续关注Tube并处理任何作业。
给你一些可能有用的链接:
实际上还有很多,但我现在记不起名字了。
问候