no message

This commit is contained in:
hellcat 2026-05-08 17:02:07 +08:00
parent b2f4fd99bb
commit 72dd2a0278

View File

@ -873,6 +873,105 @@ final class Cron
echo Tools::toDateTime(time()) . ' 付费用户过期检测完成' . PHP_EOL; echo Tools::toDateTime(time()) . ' 付费用户过期检测完成' . PHP_EOL;
} }
// public static function processEmailQueue(): void
// {
// $iTimestamp = time();
//
// while (true) {
// // 1. 超时检测
// if (time() - $iTimestamp > 299) {
// echo "邮件队列处理超时,已跳过" . PHP_EOL;
// break;
// }
//
// // 2. 核心:悲观锁取一条并立刻删除(不在发信逻辑内回滚删除)
// $oTask = DB::transaction(function () {
// $oRaw = DB::selectOne('SELECT * FROM email_queue WHERE `type` IS NULL LIMIT 1 FOR UPDATE SKIP LOCKED');
// if ($oRaw) {
// DB::delete('DELETE FROM email_queue WHERE id = ?', [$oRaw->id]);
// }
// return $oRaw;
// });
//
// if (!$oTask) {
// break; // 队列空了
// }
//
// echo '正在发送邮件至: ' . $oTask->to_email . PHP_EOL;
//
// if (!Tools::isEmail($oTask->to_email)) {
// echo $oTask->to_email . ' 格式错误' . PHP_EOL;
// continue;
// }
//
// // 3. 执行发信 (放在事务外部)
// try {
// MailHub::start()
// ->setScene($oTask->scene ?? '') // 刚才加的字段派上用场了
// ->setTitle($oTask->subject)
// ->setView($oTask->template, json_decode($oTask->array, true)) // 注意第二个参数传true转数组
// ->setTo($oTask->to_email)
// ->send();
// } catch (\Throwable $e) {
// // 仅打印错误,不影响队列继续处理下一条
// echo "发送失败: " . $e->getMessage() . PHP_EOL;
// }
// }
//
// echo "队列处理完成。" . PHP_EOL;
// }
// public static function processEmailQueue_origin(): void
// {
// if ((new EmailQueue())->count() === 0) {
// echo Tools::toDateTime(time()) . ' 邮件队列为空' . PHP_EOL;
// } else {
// //记录当前时间戳
// $timestamp = time();
// //邮件队列处理
// while (true) {
// if (time() - $timestamp > 299) {
// echo Tools::toDateTime(time()) . '邮件队列处理超时,已跳过' . PHP_EOL;
// break;
// }
//
// DB::beginTransaction();
// $email_queues_raw = DB::select('SELECT * FROM email_queue where `type` is NULL LIMIT 1 FOR UPDATE SKIP LOCKED');
//
// if (count($email_queues_raw) === 0) {
// DB::commit();
// break;
// }
//
// $email_queues = array_map(static function ($value) {
// return (array) $value;
// }, $email_queues_raw);
// $email_queue = $email_queues[0];
// echo '发送邮件至 ' . $email_queue['to_email'] . PHP_EOL;
// DB::delete('DELETE FROM email_queue WHERE id = ?', [$email_queue['id']]);
//
// if (Tools::isEmail($email_queue['to_email'])) {
// try {
// Mail::send(
// $email_queue['to_email'],
// $email_queue['subject'],
// $email_queue['template'],
// json_decode($email_queue['array'])
// );
// } catch (Exception|ClientExceptionInterface $e) {
// echo $e->getMessage();
// }
// } else {
// echo $email_queue['to_email'] . ' 邮箱格式错误,已跳过' . PHP_EOL;
// }
//
// DB::commit();
// }
//
// echo Tools::toDateTime(time()) . ' 邮件队列处理完成' . PHP_EOL;
// }
// }
// 邮件队列处理 // 邮件队列处理
public static function processEmailQueue(): void public static function processEmailQueue(): void
{ {
@ -890,42 +989,35 @@ final class Cron
DB::beginTransaction(); DB::beginTransaction();
try { $email_queues_raw = DB::select('SELECT * FROM email_queue where `type` is NULL LIMIT 1 FOR UPDATE SKIP LOCKED');
$email_queues_raw = DB::select('SELECT * FROM email_queue where `type` is NULL LIMIT 1 FOR UPDATE SKIP LOCKED');
if (count($email_queues_raw) === 0) {
DB::commit();
break;
}
$email_queues = array_map(static function ($value) {
return (array) $value;
}, $email_queues_raw);
$email_queue = $email_queues[0];
echo '发送邮件至 ' . $email_queue['to_email'] . PHP_EOL;
DB::delete('DELETE FROM email_queue WHERE id = ?', [$email_queue['id']]);
if (Tools::isEmail($email_queue['to_email'])) {
MailHub::start()
->setScene($email_queue['scene'])
->setTitle($email_queue['subject'])
->setView($email_queue['template'], json_decode($email_queue['array']))
->setTo($email_queue['to_email'])
->send();
} else {
echo $email_queue['to_email'] . ' 邮箱格式错误,已跳过' . PHP_EOL;
}
if (count($email_queues_raw) === 0) {
DB::commit(); DB::commit();
break;
} catch (Exception|ClientExceptionInterface $e) {
echo $e->getMessage();
// DB::rollBack();
} }
$email_queues = array_map(static function ($value) {
return (array) $value;
}, $email_queues_raw);
$email_queue = $email_queues[0];
echo '发送邮件至 ' . $email_queue['to_email'] . PHP_EOL;
DB::delete('DELETE FROM email_queue WHERE id = ?', [$email_queue['id']]);
if (Tools::isEmail($email_queue['to_email'])) {
MailHub::start()
->setScene($email_queue['scene'])
->setTitle($email_queue['subject'])
->setView($email_queue['template'], json_decode($email_queue['array']))
->setTo($email_queue['to_email'])
->send();
} else {
echo $email_queue['to_email'] . ' 邮箱格式错误,已跳过' . PHP_EOL;
}
DB::commit();
} }
echo Tools::toDateTime(time()) . ' 邮件队列处理完成' . PHP_EOL; echo Tools::toDateTime(time()) . ' 邮件队列处理完成' . PHP_EOL;
@ -956,39 +1048,38 @@ final class Cron
DB::beginTransaction(); DB::beginTransaction();
try { $sDate = date("Y-m-d");
$sDate = date("Y-m-d"); $aSmtp = DB::select('SELECT * FROM smtp_list WHERE `day_clear_date` != "'.$sDate.'" AND `day_count` < `day_max` ORDER BY `day_clear_date` ASC LIMIT 1 FOR UPDATE SKIP LOCKED');
$aSmtp = DB::select('SELECT * FROM smtp_list WHERE `day_clear_date` != "'.$sDate.'" AND `day_count` < `day_max` ORDER BY `day_clear_date` ASC LIMIT 1 FOR UPDATE SKIP LOCKED');
if (empty($aSmtp) || !isset($aSmtp[0])) { if (empty($aSmtp) || !isset($aSmtp[0])) {
echo Tools::toDateTime(time()) . ' 今日以没有可用smtp' . PHP_EOL; echo Tools::toDateTime(time()) . ' 今日以没有可用smtp' . PHP_EOL;
DB::commit(); DB::commit();
break; break;
} }
$oSmtp = $aSmtp[0]; $oSmtp = $aSmtp[0];
$email_queues_raw = DB::select('SELECT * FROM email_queue where `type` = "bulk" LIMIT 1 FOR UPDATE SKIP LOCKED'); $email_queues_raw = DB::select('SELECT * FROM email_queue where `type` = "bulk" LIMIT 1 FOR UPDATE SKIP LOCKED');
if (count($email_queues_raw) === 0) { if (count($email_queues_raw) === 0) {
DB::commit(); DB::commit();
break; break;
} }
$email_queues = array_map(static function ($value) { $email_queues = array_map(static function ($value) {
return (array) $value; return (array) $value;
}, $email_queues_raw); }, $email_queues_raw);
$email_queue = $email_queues[0]; $email_queue = $email_queues[0];
echo '发送邮件至 ' . $email_queue['to_email'] . PHP_EOL; echo '发送邮件至 ' . $email_queue['to_email'] . PHP_EOL;
DB::delete('DELETE FROM email_queue WHERE id = ?', [$email_queue['id']]); DB::delete('DELETE FROM email_queue WHERE id = ?', [$email_queue['id']]);
if (Tools::isEmail($email_queue['to_email'])) { if (Tools::isEmail($email_queue['to_email'])) {
MailHub::start() MailHub::start()
->setScene($email_queue['scene']) ->setScene($email_queue['scene'])
->setTitle($email_queue['subject']) ->setTitle($email_queue['subject'])
->setView($email_queue['template'], json_decode($email_queue['array'])) ->setView($email_queue['template'], json_decode($email_queue['array']))
->setTo($email_queue['to_email']) ->setTo($email_queue['to_email'])
->send(); ->send();
// Mail::send_bulk( // Mail::send_bulk(
// $email_queue['to_email'], // $email_queue['to_email'],
@ -998,19 +1089,15 @@ final class Cron
// $oSmtp // $oSmtp
// ); // );
DB::update("UPDATE smtp_list SET `day_count` = `day_count` + 1 WHERE id = ".$oSmtp->id); DB::update("UPDATE smtp_list SET `day_count` = `day_count` + 1 WHERE id = ".$oSmtp->id);
} else { } else {
echo $email_queue['to_email'] . ' 邮箱格式错误,已跳过' . PHP_EOL; echo $email_queue['to_email'] . ' 邮箱格式错误,已跳过' . PHP_EOL;
}
DB::commit();
} catch (Exception|ClientExceptionInterface $e) {
echo $e->getMessage();
} }
DB::commit();
} }
echo Tools::toDateTime(time()) . ' 群发邮件队列处理完成' . PHP_EOL; echo Tools::toDateTime(time()) . ' 群发邮件队列处理完成' . PHP_EOL;