Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierungsmethode für asynchrones Massenmailing mit thinkphp5 und swoole

Implementierungsmethode für asynchrones Massenmailing mit thinkphp5 und swoole

小云云
小云云Original
2018-03-14 13:03:422930Durchsuche

Dieser Artikel teilt Ihnen hauptsächlich die Implementierungsmethode des asynchronen Massenmailings in thinkphp5 und swoole mit. Ich hoffe, er kann Ihnen helfen.


1. Umgebungsbeschreibung

Alibaba Cloud Centos7
thinkphp5.0.11
swoole2.0.8

2 E-Mail-Versand

Erstellen Sie das folgende Dateiverzeichnis unter dem Projekt:

Unter anderem ist SendMail.php die Datei, die wir tatsächlich zum Senden von E-Mails aufrufen . Das Folgende ist der Hauptcode: Die Konfigurationselemente in

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;
        }
    }
}

werden in der Datei config.php unter dem Projekt abgelegt. Der spezifische Konfigurationsinhalt lautet wie folgt:

 //邮箱设置
    '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

Hier implementieren wir nur die vom SMTP-Protokoll gesendete Demo, daher ist sie auf Verpackungsebene nicht sehr umfassend und flexibel. Die anderen beiden Dateien im Bild (PhpMailer.php und Smtp.php) sind die Kerndateien der PHPMailer-E-Mail-Versandklasse. Zur Vereinfachung des Aufrufs können Sie sich auf die Verwendung von gayhub beziehen Anleitung phpmailer

2.2 Hinweise

In diesem Schritt müssen wir auf einige Punkte achten: 1. Ob das Konto, das Sie zum Senden der E-Mail festgelegt haben, SMTP aktiviert hat und das entsprechende Sicherheitsprotokoll finden und Portnummer. 2. Ob der aktuelle Server den SMTP-Dienst unterstützt, der häufig von einigen Socket-Funktionen betroffen ist. Wenn Probleme auftreten, sollten wir den SMTPDebug-Parameter auf 1 setzen und dann sorgfältig anhand der Debug-Informationen debuggen. 3. Einige gesendete E-Mails werden in den Papierkorb verschoben. Bitte überprüfen Sie sie sorgfältig.

2.3 Rufen Sie

auf, um die folgende Dateiverzeichnisstruktur einzurichten:

Rufen Sie die Methode zum Senden von E-Mails in Index.php auf, die spezifische Der Code lautet wie folgt:

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

2.4 Anrufergebnis

Wir finden eine E-Mail, die wir gerade gesendet haben, im Papierkorb von QQ Mailbox

3. Mit Swoole kombinieren, um asynchronen Massenversand zu erreichen

3.1 Swoole installieren

Die detaillierten Schritte zur Installation der Swoole-Erweiterung sind auf der offiziellen Website verfügbar, also habe ich gewonnen. Um nicht auf Details einzugehen, das Swoole-Dokumentenportal
Nach der Installation von Swoole wird empfohlen, Swoole-Code-Eingabeaufforderungen zu Ihrer IDE hinzuzufügen und das Portal für IDE-Eingabeaufforderungen Swoole-Code zu konfigurieren

3.2 Asynchrones Massensenden implementieren

Wir implementieren zunächst den asynchronen Server:

    /**
     * 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();
    }

Auf der Serverseite haben wir eine 20er-Schleife verwendet, um Massenversand zu simulieren, und diese tatsächlich in eine andere E-Mail-Adresse geändert.
Als nächstes implementieren wir den 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 Starten Sie den Server

Hier müssen Sie die CLI-Methode verwenden, wir geben das Stammverzeichnis des Projekts ein.
Ausführen

netstat -apn | grep 8082

Überwachen Sie zunächst, ob Port 8082 belegt ist,

kill -9 PID(进程号)

Beenden Sie den Prozess

Dann führen wir

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

Die Funktion dieses Befehls besteht darin, den CLI-Modus zu verwenden, um unseren 8082-Port in den Überwachungszustand zu versetzen. Und lassen Sie dieses Terminal aktiv, damit wir die gesendeten Ergebnisse sehen können.

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

php public/index.php index/index/index

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

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


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

4、后记~

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

Das obige ist der detaillierte Inhalt vonImplementierungsmethode für asynchrones Massenmailing mit thinkphp5 und swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn