How to send emails using PHPMailer in the background?

試著忘記壹切 提交于 2019-11-30 09:36:21
Rafa

The use of an email queue and php exec() is one of the best ways.

It will trigger when needed (avoiding the use of CRONs), it's fast because it is called backgrounded, and immediate.

1. Email queue. Take all fields in a table's MySQL with an insert, something like:

$queryIN="INSERT INTO email_queue (date,subject,body,destination,idle) values (...)";
mysql_query($queryIN);

That's important because you will need an independent background process, so also it's a good idea for registering and auditing all outgoing emails.

2. PHP exec(). After inserting in MySQL is time to call as external execution:

exec("wget -qO- http://example.com/index.php?process_email_queue=1 &> /dev/null &");
  • Take note, options from wget -q0- and &> ... /dev/null & are needed to suppress output and call as a background process.

3. Same script file index.php or other for processing call of a queue:

This way, it will call our index.php (you can use other name file), and process outgoing:

if ($_GET['process_email_queue']==1) { ...code for sending idle emails queue...  }

Perhaps you have to touch some php.ini options for exec(), is not a big deal.

Once everything is running correctly, you will offer a better web navigation and email handling for fast response and zero waits.

In some cases you will pass from waiting from a direct email 2.60 secs to queue-exec-background 0.024 secs, which is a speed improvement of 11 times faster.

You could use an AJAX request to post data to PHP script, which will then send the email.

You can use exec to tell the PHP CLI interpreter to run your script in the background.

if you are on linux:

exec("/path/to/php /path/to/your/mailer/script \"arg1\" \"arg2\" \"arg3\" \"arg4\"  > /dev/null 2> /dev/null &");

if you are on windows:

 pclose(popen("start /B /path/to/php /path/to/php/script \"arg1\" \"arg2\" \"arg3\" \"arg4\"","r"));

This requires that your server have PHP's CLI interpreter installed and requires that you know the path to the PHP binary (ask your host if you don't know). You also need to know the absolute path to your PHP script, which you can find using get_cwd().

zzlalani

If you are interested in sending email via async PHP, you can have a look at this answer. https://stackoverflow.com/a/22627769/829533

<?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());
?>

it is using Thread of php PECL pthreads library

Please note that setting up PECL for your Apache environment is the most tricky part

Plus in the very same post people suggested about setting corn jobs for such requirements but it totally depends on your requirement. you can

  • create a new table to schedule emails.
  • write a php script to send emails using details from newly create table
  • setup a corn job to run this script at some interval

There are many background process software like Beanstalkd, GearMan etc...

I suggest beanstalkd because it's very light weight and simple. Easy to create job and pass to queue (Tube in their terms).

One additional worker required who continues keeping eye on Tube and process if any job came.

Giving you some links that might help you,

  1. Beanstalkd
  2. Gearman

Actually there are many more, but i don't remember name right now.

Regards

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!