Maison  >  Article  >  développement back-end  >  Méthode de mise en œuvre du mailing de masse asynchrone utilisant thinkphp5 et swoole

Méthode de mise en œuvre du mailing de masse asynchrone utilisant thinkphp5 et swoole

小云云
小云云original
2018-03-14 13:03:423016parcourir

Cet article partage principalement avec vous la méthode d'implémentation du mailing de masse asynchrone dans thinkphp5 et swoole. J'espère qu'il pourra vous aider.


1. Description de l'environnement

Alibaba cloud centos7
thinkphp5.0.11
swoole2.0.8

2. Envoi d'emails

Créez le répertoire de fichiers suivant sous le projet :

Parmi eux, SendMail.php est le fichier que nous appelons réellement pour envoyer des emails . Voici le code principal : Les éléments de configuration de

namespace app\library\utils\mail;use app\library\utils\mail\PhpMailer;use app\library\utils\mail\Smtp;use think\Log;

error_reporting(E_STRICT);
date_default_timezone_set('Asia/Shanghai');class SendMail{    static function postmail($to,$subject = '',$body = ''){
        $mail = new PhpMailer();
        $mail->CharSet    = config('mail.CharSet');
        $mail->IsSMTP();
        $mail->SMTPDebug  = config('mail.SMTPDebug');
        $mail->SMTPAuth   = config('mail.SMTPAuth');
        $mail->SMTPSecure = config('mail.SMTPSecure');
        $mail->Host       = config('mail.Host');
        $mail->Port       = config('mail.Port');
        $mail->Username   = config('mail.Username');
        $mail->Password   = config('mail.Password');
        $mail->SetFrom(config('mail.From'), config('mail.Name'));
        $mail->Subject    = $subject;
        $mail->MsgHTML($body);
        $address = $to;
        $mail->AddAddress($address, '');        if(!$mail->Send()) {
            Log::write('send to '.$to.'error info:'.$mail->ErrorInfo);            return false;
        } else {            return true;
        }
    }
}

sont placés dans le fichier config.php sous le projet. Le contenu de configuration spécifique est le suivant :

 //邮箱设置
    'mail'=>[        'CharSet'=>'UTF-8',        'SMTPDebug'=>0,// 启用SMTP调试功能 0关闭
        'SMTPAuth'=>true,// 启用 SMTP 验证功能
        'SMTPSecure'=>'ssl',// 安全协议
        'Host'=>'smtp.163.com',// SMTP 服务器
        'Port'=>465,// SMTP服务器的端口号
        'Username'=>'**********',// SMTP服务器用户名
        'Password'=>'**********',// SMTP服务器密码
        'From'=>'*********@163.com',// 发件人邮箱
        'Name'=>'blue',// 发件人邮箱
    ]

. 2.1

Ici nous implémentons uniquement la démo envoyée par le protocole SMTP, elle n'est donc pas très complète et flexible au niveau packaging. Les deux autres fichiers de l'image (PhpMailer.php et Smtp.php) sont les fichiers de base de la classe d'envoi d'e-mails Phpmailer. Afin de simplifier l'appel, ils sont extraits. Pour une utilisation détaillée et les paramètres, vous pouvez vous référer à l'utilisation de gayhub. instructions phpmailer

2.2 Notes

Dans cette étape, nous devons prêter attention à quelques points : 1. Si le compte que vous avez défini pour envoyer l'e-mail a activé SMTP et trouver le protocole de sécurité correspondant et le numéro de port. 2. Si le serveur actuel prend en charge le service SMTP, qui est souvent affecté par certaines fonctions du socket, lorsque nous rencontrons des problèmes, nous devons définir le paramètre SMTPDebug sur 1, puis déboguer soigneusement en fonction des informations de débogage. 3. Certains e-mails sortants seront mis à la corbeille, veuillez les vérifier attentivement.

2.3 Appelez

pour établir la structure de répertoires de fichiers suivante :

Appelez la méthode d'envoi d'e-mails dans Index.php, le spécifique le code est le suivant

public function sendMail()
{        
if(SendMail::postmail('937069176@qq.com','test','123'))
{            echo 'send success';
        }else{            
        echo 'send fail';
}
}

2.4 Résultat de l'appel

On peut retrouver un email qu'on vient d'envoyer dans la poubelle de QQ boîte aux lettres

3. Combiner avec swoole pour réaliser un envoi de masse asynchrone

3.1 Installer swoole

Les étapes détaillées pour l'installation de l'extension swoole sont disponibles sur le site officiel, donc je ne vais pas le faire. Pour entrer dans les détails, le portail de documents swoole
Après avoir installé swoole, il est recommandé d'ajouter des invites de code swoole à votre IDE et de configurer le portail pour les invites IDE swoole code

3.2 Implémenter l'envoi de masse asynchrone

Nous avons d'abord implémenté le serveur asynchrone :

    /**
     * description:服务端
     */
    public function syncSend(){
        $serv = new \swoole_server('0.0.0.0',8082);

        $serv->set(array('task_worker_num' => 4));

        $serv->on('receive', function($serv, $fd, $from_id, $data) {
            $task_id = $serv->task($data);            echo "开始投递异步任务 id=$task_id\n";
        });

        $serv->on(&#39;task&#39;, function ($serv, $task_id, $from_id, $data) {            echo "接收异步任务[id=$task_id]".PHP_EOL;            for ($i = 0 ; $i<20;$i++){                if(SendMail::postmail(&#39;937069176@qq.com&#39;,&#39;test&#39;,$data)){                    echo &#39;send&#39;.$i.&#39; success&#39;."\n";
                }else{                    echo &#39;send&#39;.$i.&#39; fail&#39;."\n";
                }
        }
        $serv->finish(&#39;&#39;);
        });

        $serv->on(&#39;finish&#39;, function ($serv, $task_id, $data) {            echo "异步任务[id=$task_id]完成".PHP_EOL;
        });

        $serv->start();
    }

Côté serveur, nous avons utilisé une boucle de 20 pour simuler l'envoi de masse, et l'avons en fait changée en une adresse e-mail différente.
Ensuite, nous implémentons le client

    /**
     * description:客户端
     */
    public function index()
    {
        $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
        $ret = $client->connect("127.0.0.1", 8082);        if(empty($ret)){            echo &#39;error!connect to swoole_server failed&#39;;
        } else {
            $client->send(&#39;blue&#39;);//这里只是简单的实现了发送的内容
        }
    }

3.3 Démarrez le serveur

Vous devez utiliser la méthode CLI ici, nous entrons dans le répertoire racine du projet.
Exécuter

netstat -apn | grep 8082

Surveillez d'abord si le port 8082 est occupé,

kill -9 PID(进程号)

Tuez le processus

Ensuite, nous exécutons

.
php public/index.php index/index/syncSend

La fonction de cette commande est d'utiliser le mode cli pour mettre notre port 8082 en état d'écoute. Et gardez ce terminal actif pour que nous puissions visualiser les résultats envoyés.

接着我们可以用CLI或者浏览器访问的方式来访问我们的客户端

php public/index.php index/index/index

当我们执行一次的时候客户端的时候,我们可以在服务端的终端看到屏幕上面出现如下的画面:

说明我们已经正常群发了。
下面,我们就来测试异步,因为163服务器会对IP进行检测,如果在某个时间发送也别频繁的话,会出现发送失败的情况,所以我们测试的时候,采用连续执行4次客户端的方式
下面是执行的结果:


从图中发送的顺序来看,我们可以很容易的判断,我们已经实现了异步的发送。
邮箱里面也接收到了刚刚发送的邮件。

4、后记~

swoole是一种想要熟悉和熟练使用的扩展,但是限于网络编程知识的不足,所以还是要多多测试和学习,demo中有不足的地方,还请指出。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn