<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// mail worker,和調用端使用Text協議通訊
$mail_worker = new Worker('Text://0.0.0.0:12345');
// 如果發送郵件很慢,mail進程數可以根據需要多開壹些
$mail_worker->count = 80;
$mail_worker->name = 'MailWorker';
$mail_worker->onMessage = function($connection, $mail_data)
{
// 直接返回ok,避免調用端長時間等待
$connection->send('ok');
// 假設發來的是json數據
$mail_data = json_decode($mail_data, true);
// 根據mail_data發郵件,如果需要失敗重發,
// 可以把失敗的郵件任務放到mysql裏面,
// 做個定時器定時掃描失敗郵件重新發送
your_send_mail_func($mail_data);
};
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
在妳的項目中這樣與mail_worker通訊發郵件。
//$ip = "mail_worker 的ip" ,本機的話為127.0.0.1
$socket = stream_socket_client("tcp://$ip:12345", $errno, $errmsg, 5);
if(!$socket) echo $errmsg;
$mail_data = array("from"=>"...", "to"=>"...", "content"=>"...");
// 註意,Text協議後面"\n"換行符是必須的
$mail_buffer = json_encode($mail_data)."\n";
// 發送給mail worker
fwrite($socket, $mail_buffer);
這樣就可以異步發郵件了,防止主流程被發郵件阻塞,大大加快下單響應時間。
其實下單後能夠在網站上實時通知也是個不錯的體驗,用戶這邊下單後,商家在網站上立刻得到通知,效果圖類似
接入非常簡單