Cet article présente principalement l'implémentation détaillée de thinkphp5+swoole pour implémenter le mailing de masse asynchrone (méthode SMTP), qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Cet article présente l'implémentation de thinkphp5+. swoole Envoi de masse asynchrone (méthode SMTP), partagez avec tout le monde, les détails sont les suivants :
1 Description de l'environnement
Alibaba Cloud centos7.
thinkphp5.0.11
swoole2.0.8
2. envoyer
Créez le répertoire de fichiers suivant sous le projet :
Parmi eux, SendMail.php est le fichier auquel nous appelons réellement envoyer des e-mails. Voici le code principal : Les éléments de configuration dans
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. comme suit :
//邮箱设置 '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 au niveau packaging et n'est pas très souple. 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 ouvert SMTP et recherchez le protocole de sécurité et le numéro de port correspondants. 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 code spécifique 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 nous retrouver dans la poubelle can of QQ mailbox Un email vient d'être envoyé
3 Combiné avec swoole pour réaliser un envoi massif asynchrone 3.1 Installation de swoole
Les étapes détaillées pour l'installation de l'extension swoole sont disponibles sur le site officiel, donc je n'entrerai pas dans les détails, swoole Document Portal
Après avoir installé swoole, il est recommandé d'ajouter des invites de code swoole à votre IDE et de configurer le portail de code swoole d'invite IDE
3.2 Implémenter l'envoi de masse asynchrone
Nous implémentons d'abord 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('task', function ($serv, $task_id, $from_id, $data) { echo "接收异步任务[id=$task_id]".PHP_EOL; for ($i = 0 ; $i<20;$i++){ if(SendMail::postmail('937069176@qq.com','test',$data)){ echo 'send'.$i.' success'."\n"; }else{ echo 'send'.$i.' fail'."\n"; } } $serv->finish(''); }); $serv->on('finish', function ($serv, $task_id, $data) { echo "异步任务[id=$task_id]完成".PHP_EOL; }); $serv->start(); }
On Côté serveur, nous utilisons une boucle de 20. Après avoir simulé un envoi massif, vous pouvez effectivement la changer en une autre adresse email.
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 'error!connect to swoole_server failed'; } else { $client->send('blue');//这里只是简单的实现了发送的内容 } }
3.3 Ouvrir le serveur
La CLI doit être utilisée ici méthode, nous entrons dans le répertoire racine du projet.
Exécuter
netstat -apn | grep 8082
Surveillez d'abord si le port 8082 est occupé, si c'est le cas
kill -9 PID(进程号)
Tuer le processus
Ensuite on exécute la commande
php public/index.php index/index/syncSend
La fonction est 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.
Ensuite, nous pouvons utiliser l'accès CLI ou navigateur pour accéder à notre client
php public/index.php index/index/index
Lorsque nous l'exécutons une fois Du côté client, nous Vous pouvez voir l'écran suivant sur le terminal du serveur :
Cela signifie que nous avons envoyé le groupe normalement.
Ensuite, nous testerons asynchrone, car le serveur 163 détectera l'IP si l'envoi n'est pas fréquent à un certain moment, l'envoi échouera, donc lorsque nous testerons, utilisez la méthode de. exécuter le client 4 fois de suite
Voici le résultat de l'exécution :
À en juger par la séquence d'envoi sur la figure, nous pouvons facilement juger que nous avons implémenté l'envoi asynchrone.
L'email qui vient d'être envoyé a également été reçu dans la boîte aux lettres.
4. Postscript~
swoole est une extension que vous souhaitez connaître et utiliser avec compétence, mais elle est limitée. aux connaissances en programmation réseau. Insuffisant, vous devez donc toujours tester et en savoir plus. S'il y a des lacunes dans la démo, veuillez le signaler QAQ
.Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
Comment générer automatiquement des modules et des répertoires dans Thinkphp5.0
la requête multi-table thinkphp a deux tables La solution parfaite pour répéter les mêmes champs
Utiliser ThinkAjax intégré de ThinkPHP pour implémenter la technologie de transmission asynchrone
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!