日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP簡易延時隊列的實現流程詳解

瀏覽:280日期:2022-06-05 17:00:41
目錄
  • 需求說明
  • 設計思路
  • 實現
  • 最后說點

需求說明

  • 當用戶申請售后,商家未在n小時內處理,系統自動進行退款。
  • 商家拒絕后,用戶可申請客服介入,客服x天內超時未處理,系統自動退款。
  • 用戶收到貨物,x天自動確認收貨
  • 等等需要延時操作的流程……

設計思路

  • 設計一張隊列表,記錄所有隊列的參數,執行狀態,重試次數
  • 將創建隊列的id 存于redis 中,使用zset有序集合。按照時間戳進行排序
  • 使用croontab定時任務每分鐘執行一次

實現

新建隊列表

CREATE TABLE `delay_queue` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `params` varchar(512) DEFAULT NULL,
  `message` varchar(255) DEFAULT "" COMMENT "執行結果",
  `ext_string` varchar(255) DEFAULT "" COMMENT "擴展字符串,可用于快速檢索。取消該隊列",
  `retry_times` int(2) DEFAULT "0" COMMENT "重試次數",
  `status` int(2) NOT NULL DEFAULT "1" COMMENT "1 待執行, 10 執行成功, 20 執行失敗,30取消執行",
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ext_idx` (`ext_string`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

部分隊列的操作方法,新增隊列、取消隊列、隊列執行成功、隊列執行失敗、隊列重試【重試時間間隔抄的微信支付的異步通知時間】

class DelayQueueService
{
    // 重試時間,最大重試次數 15
    private static $retryTimes = [
15, 15, 30, 3 * 60, 10 * 60, 20 * 60, 30 * 60, 30 * 60, 30 * 60, 60 * 60,
3 * 60 * 60, 3 * 60 * 60, 3 * 60 * 60, 6 * 60 * 60, 6 * 60 * 60,
    ];
	/**
	 * @description 增加隊列至redis
	 * @param $queueId
	 * @param int $delay 需要延遲執行的時間。單位秒
	 * @return void
	 */
	public function addDelayQueue($queueId, int $delay)
	{
	    $time = time() + $delay;
	    $redis = RedisService::getInstance();
	    $redis->zAdd("delay_queue_job", $time, $queueId);
	}
	// 取消redis 隊列
	public function cancelDelayQueue($ext)
	{
	    $row = $query->getRow(); // 使用ext_string 快速檢索到相應的記錄
	    if ($row) {
	$redis = RedisService::getInstance();
	$redis->zRem("delay_queue_job", $row->id);
	$row->status = DelayQueueTable::STATUS_CANCEL;
	$table->save($row);
	    }
	}
	/**
	 * @description 執行成功
	 * @return void
	 */
	public static function success($id, $message = null)
	{
	    $table->update([
	"status" => DelayQueueTable::STATUS_SUCCESS,
	"message" => $message ?? "",
	"modified" => date("Y-m-d H:i:s"),
	    ], [
	"id" => $id,
	    ]);
	}
	/**
	 * @description 執行失敗
	 * @return void
	 */
	public static function failed($id, $message = null)
	{
	    $table->updateAll([
	"status" => DelayQueueTable::STATUS_FAILED,
	"message" => $message ?? "",
	"modified" => date("Y-m-d H:i:s"),
	    ], [
	"id" => $id,
	    ]);
	}
	/**
	 * @description 失敗隊列重試,最大重試15次
	 * @param $id
	 * @return void
	 */
	public static function retry($id)
	{
	    $info = self::getById($id);
	    if (!$info) {
	return;
	    }
	    $retryTimes = ++$info["retry_times"];
	    if ($retryTimes > 15) {
	return;
	    }
	    $entity = [
	"params" => $info["params"],
	"ext_string" => $info["ext_string"],
	"retry_times" => $retryTimes,
	    ];
	    $queueId = $table->save($entity);
	    self::addDelayQueue($queueId, self::$retryTimes[$retryTimes - 1]);
	}
}

在命令行進行任務的運行

public function execute(Arguments $args, ConsoleIo $io)
{
    $startTimestamp = strtotime("-1 days");
    $now = time();
    $redis = RedisService::getInstance();
    $queueIds = $redis->zRangeByScore("delay_queue_job", $startTimestamp, $now);
    if ($queueIds) {
foreach ($queueIds as $id) {
    $info = // 按照隊列id 獲取相應的信息
    if ($info["status"] === DelayQueueTable::STATUS_PADDING) {
$params = unserialize($info["params"]); // 創建記錄的時候,需要試用serialize 將類名,方法,參數序列化
$class = $params["class"];
$method = $params["method"];
$data = $params["data"];
try {
    call_user_func_array([$class, $method], [$data]);
    $redis->zRem("delay_queue_job", $id);
    $msg = date("Y-m-d H:i:s") . " [info] success: $id";
    DelayQueueService::success($id, $msg);
    $io->success($msg);
} catch (Exception $e) {
    $msg = date("Y-m-d H:i:s") . " [error] {$e->getMessage()}";
DelayQueueService::failed($id, $msg);
// 自定義異常code,不進行隊列重試
if (10000 != $e->getCode()) {
    DelayQueueService::retry($id);
}
$io->error($msg);
}
    }
}
    }
}

最后說點

  • 我這邊的系統對實時性要求不高,所以直接使用的是linuxcrond 服務,每分鐘運行一次。如需精確到秒級,可寫一個shell,一分鐘循環執行<=60
  • 因為目前的數據較少,延時隊列加入的只有小部分。所以就在command 里面直接執行更新操作了,后期如果隊列多,且有比較耗時的操作,可考慮把耗時操作單獨放置一個隊列中。本方法只用于將數據塞進隊列。

附上 shell 腳本 一分鐘執行60次

#!/bin/bash
step=2 #間隔的秒數,不能大于60
for (( i = 0; i < 60; i=(i+step) )); do
   echo $i # do something
   sleep $step
done 

到此這篇關于PHP簡易延時隊列的實現流程詳解的文章就介紹到這了,更多相關PHP延時隊列內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品久久久久中文字幕小说| 国产视频一区免费看| 成人久久一区| 国产高清日韩| 最近国产精品视频| 一区二区自拍| 天堂资源在线亚洲| 久久精品一区二区不卡| 成人国产精品| 精品亚洲二区| 欧美xxxx性| 在线观看视频免费一区二区三区| 欧美sss在线视频| 91视频久久| 精品视频高潮| 久久99精品久久久野外观看| 日本va欧美va精品发布| 久久亚洲风情| 爽爽淫人综合网网站| 日韩在线观看不卡| 日韩中文在线电影| 精品一区二区三区中文字幕视频| 欧美日韩亚洲国产精品| 欧美一级全黄| 欧美一区自拍| 欧美日韩夜夜| 亚洲欧美网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜精品亚洲| 99国产精品99久久久久久粉嫩| 欧美/亚洲一区| 午夜欧美在线| 免费成人在线观看| 亚洲精品观看| 国产精品三p一区二区| 国产精品白丝久久av网站| 久久激情五月激情| 欧美在线精品一区| 日韩在线一二三区| 国产亚洲亚洲| 日本va欧美va精品| 精品精品国产三级a∨在线| 国产超碰精品| 亚洲18在线| 成人精品国产亚洲| 影音先锋久久精品| 日韩1区在线| 免费看黄色91| 精品一区二区三区视频在线播放| 国产精品99一区二区| 日韩综合小视频| 日本一二区不卡| 男人的天堂久久精品| 老司机免费视频一区二区三区| 免费观看久久av| 欧美亚洲三区| 久久在线免费| 欧美日韩一区二区三区在线电影| 中文字幕在线官网| 亚洲精品成a人ⅴ香蕉片| 成人三级高清视频在线看| 日韩午夜高潮| 精品国产黄a∨片高清在线| 巨乳诱惑日韩免费av| 国产va在线视频| 日韩精品高清不卡| 久久国产亚洲| 久久av国产紧身裤| 美女精品在线| 日韩精品中文字幕第1页| 日韩精品久久理论片| 欧美不卡高清一区二区三区| 日韩福利视频网| 欧美成人高清| 国产一区二区三区四区五区传媒| 蜜桃视频在线观看一区| 精品捆绑调教一区二区三区| 日韩av黄色在线| 在线一区欧美| 婷婷综合六月| 久久精品一区二区国产| 免费人成精品欧美精品 | 亚洲精品一区二区在线看| 国产精品手机在线播放| 99视频精品| 亚洲播播91| 麻豆91精品视频| 日韩精品一区二区三区av| 亚洲激情社区| 久久中文字幕av一区二区不卡| 久久99视频| 欧美亚洲综合视频| 一级成人国产| 国产偷自视频区视频一区二区| 日韩欧美精品| 精品一区不卡| 国产精品一区二区精品| 亚洲欧洲美洲国产香蕉| 99在线精品免费视频九九视| а√天堂中文在线资源8| 国产探花在线精品一区二区| 中文在线日韩| 亚洲大全视频| 一区二区三区四区在线看| 亚洲免费福利| 国产一区二区三区久久久久久久久| 欧美色综合网| 日本午夜精品| 蜜臀精品久久久久久蜜臀| 夜夜精品视频| 午夜在线视频观看日韩17c| 亚洲欧美一区在线| 91精品国产自产在线观看永久∴| 成人在线视频中文字幕| 国产精品伦一区二区| 91久久精品无嫩草影院| 日韩精品91亚洲二区在线观看| 视频一区中文字幕| 羞羞答答国产精品www一本| aa国产精品| 亚洲女同中文字幕| 亚洲激情国产| 久久香蕉精品| 亚洲永久精品唐人导航网址| 亚洲精选av| 日本不卡中文字幕| 久久国产精品色av免费看| 久久精品72免费观看| 国产精品亚洲人成在99www| 丝袜亚洲精品中文字幕一区| 久久久久久网| 高潮久久久久久久久久久久久久| 久久国产生活片100| 麻豆成人91精品二区三区| 美女久久精品| 国产九九精品| 清纯唯美亚洲综合一区| 乱一区二区av| 久久精品伊人| 亚洲激情av| a天堂资源在线| 激情欧美丁香| 日韩中文字幕| 成人羞羞在线观看网站| 日本精品黄色| 欧美日韩国产传媒| 日本v片在线高清不卡在线观看| 成人在线免费观看91| 国产精品99一区二区三| 亚洲精品无播放器在线播放| 国产精品网站在线看| 精品福利久久久| 水蜜桃久久夜色精品一区的特点 | 蜜臀国产一区| 99视频精品全国免费| 激情婷婷亚洲| 国产一区二区三区日韩精品| 国产一区日韩欧美| 久久精品国产网站| 欧美激情99| 国产日产精品_国产精品毛片 | 精品国产a一区二区三区v免费| 亚洲主播在线| 久久不射网站| 麻豆精品视频在线观看视频| 国产91久久精品一区二区| 午夜视频精品| 亚洲精品一二三区区别| 伊人精品在线| 狠狠爱www人成狠狠爱综合网| 精品亚洲精品| 天堂av在线| 国产精品视频3p| 日韩成人一级| 久久久久久久久久久妇女| 青青草国产成人99久久| 极品日韩av| а√在线中文在线新版| 欧美在线91| 一区二区亚洲视频| 日韩三区免费| 亚洲精品看片| 视频在线观看国产精品| 免费av一区二区三区四区| 久久网站免费观看| 久久精品 人人爱| 亚洲四虎影院| 国产精品xvideos88| 97欧美在线视频| 999国产精品视频| 亚洲永久字幕| 国产九一精品| 国产精品xx| 色黄视频在线观看| 欧美三级网址| 在线精品视频在线观看高清| 国产精选在线| 欧美日韩国产高清电影| 国产日韩专区| 久久亚洲国产|