国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman 定時器中的任務(wù)執(zhí)行失敗了,怎么做異常處理?

ss7424

我使用了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í)行中的錯誤

4383 2 0
2個回答

小陽光

自己捕獲異常呀,把異常處理掉,也可以驗證一下你的郵箱地址。

  • 暫無評論
ss7424

我改掉郵件發(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());
 }
  • 暫無評論
年代過于久遠,無法發(fā)表回答
??