我使用了thinkphp5.0在id=0的進程上創(chuàng)建了一個查詢數(shù)據(jù)的郵件內(nèi)容,定時發(fā)送郵件的任務(wù).
worker.php
如下:
namespace app\push\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
use think\Log;
class Worker extends Server
{
protected $socket = 'websocket://0.0.0.0:2344';
/**
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
}
/**
* 當連接建立時觸發(fā)的回調(diào)函數(shù)
* @param $connection
*/
public function onConnect($connection)
{
}
/**
* 當連接斷開時觸發(fā)的回調(diào)函數(shù)
* @param $connection
*/
public function onClose($connection)
{
}
/**
* 當客戶端的連接上發(fā)生錯誤時觸發(fā)
* @param $connection
* @param $code
* @param $msg
*/
public function onError($connection, $code, $msg)
{
}
/**
* 每個進程啟動
* @param $worker
*/
public function onWorkerStart($worker)
{
// 只在id編號為0的進程上設(shè)置定時器,其它1、2、3號進程不設(shè)置定時器
if($worker->id === 0) {
Timer::add(2, function()use($worker){
Log::record('[Worker][id][1][SendMail]');
$watcher = controller('tasks/MailMan');
$watcher->dog();
});
}
}
}
task/MailMan
執(zhí)行的任務(wù)內(nèi)容如下:
namespace app\tasks\controller;
use ext\MailTemplate;
use think\Db;
use think\Exception;
use think\Loader;
use think\Log;
Loader::import('lib.swift_required');
use Swift_SmtpTransport;
use Swift_Mailer;
use Swift_Message;
class MailMan {
public function dog() {
try {
Log::record('[MailMan] start');
$res = Db::table('ems_mail_queue')->where('to', '<>', '[]')
->order('id')->select();
foreach ($res as $key => $item) {
if (FLOW == $item['type']) {
$content = MailTemplate::getContent($item['main_body'], $item['table_data']);
$cc = config('mail_cc');
} else {
$content = MailTemplate::getImportContent($item['main_body'], $item['table_data']);
$cc = config('mail_import_cc');
}
Log::record($content);
$r = self::send($item['from'], json_decode($item['to'], true), $cc,
$item['subject'], $content);
if ($r > 0) {
Log::record('[MailMan][dog] success ' .$item['id']);
// 刪除該條記錄
Db::table('ems_mail_queue')->where('id', $item['id'])->delete();
} else {
Log::record('[MailMan][dog] fail ' .$item['id']);
}
}
} catch (Exception $e) {
Log::record('[MailMan][dog] error' . $e->getMessage());
}
Log::record('[MailMan] end');
}
// 發(fā)送郵件function
private static function send($from, $to, $cc, $mailTitle, $content) {
$transport = Swift_SmtpTransport::newInstance(config('smtp_host'), config('smtp_port'));
$mailer = Swift_Mailer::newInstance($transport);
// Create a message
$message = Swift_Message::newInstance($mailTitle)
->setFrom(array($from))
->setTo($to) // 這里也是需要數(shù)組的
->setCc(json_decode($cc, true))
->setBody($content, 'text/html', 'utf-8');
// Send the message
$result = $mailer->send($message);
return $result;
}
}
我碰到的是如果MailMan.php
中的$item['from']
或者$item['to']
的數(shù)據(jù)不對,也就是發(fā)件人或者收件人的地址不對,導(dǎo)致郵件發(fā)送不出去報錯了.怎么才能控制異常,執(zhí)行$res
下一條數(shù)據(jù)?
如下圖.我啟動的server.php
執(zhí)行的時候像是碰到了異常,會終止該進程號重新開啟一個新的workman進程號?
php server.php start執(zhí)行中的錯誤
我改掉郵件發(fā)送異常捕捉的方式了.
try {
$r = self::send($item['from'], json_decode($item['to'], true), $cc,
$item['subject'], $content);
if ($r > 0) {
Log::record('[MailMan][dog] success ' .$item['id']);
// 刪除該條記錄
Db::table('ems_mail_queue')->where('id', $item['id'])->delete();
}
} catch (Swift_RfcComplianceException $e) {
Log::record('[MailMan][dog] fail ' .$item['id'] .' '.$e->getMessage());
}