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

您的位置:首頁技術(shù)文章
文章詳情頁

PHP簡易延時隊列的實(shí)現(xiàn)流程詳解

瀏覽:283日期:2022-06-05 17:00:41
目錄
  • 需求說明
  • 設(shè)計思路
  • 實(shí)現(xiàn)
  • 最后說點(diǎn)

需求說明

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

設(shè)計思路

  • 設(shè)計一張隊列表,記錄所有隊列的參數(shù),執(zhí)行狀態(tài),重試次數(shù)
  • 將創(chuàng)建隊列的id 存于redis 中,使用zset有序集合。按照時間戳進(jìn)行排序
  • 使用croontab定時任務(wù)每分鐘執(zhí)行一次

實(shí)現(xiàn)

新建隊列表

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

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

class DelayQueueService
{
    // 重試時間,最大重試次數(shù) 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 需要延遲執(zhí)行的時間。單位秒
	 * @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 快速檢索到相應(yīng)的記錄
	    if ($row) {
	$redis = RedisService::getInstance();
	$redis->zRem("delay_queue_job", $row->id);
	$row->status = DelayQueueTable::STATUS_CANCEL;
	$table->save($row);
	    }
	}
	/**
	 * @description 執(zhí)行成功
	 * @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 執(zhí)行失敗
	 * @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]);
	}
}

在命令行進(jìn)行任務(wù)的運(yùn)行

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 獲取相應(yīng)的信息
    if ($info["status"] === DelayQueueTable::STATUS_PADDING) {
$params = unserialize($info["params"]); // 創(chuàng)建記錄的時候,需要試用serialize 將類名,方法,參數(shù)序列化
$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,不進(jìn)行隊列重試
if (10000 != $e->getCode()) {
    DelayQueueService::retry($id);
}
$io->error($msg);
}
    }
}
    }
}

最后說點(diǎn)

  • 我這邊的系統(tǒng)對實(shí)時性要求不高,所以直接使用的是linuxcrond 服務(wù),每分鐘運(yùn)行一次。如需精確到秒級,可寫一個shell,一分鐘循環(huán)執(zhí)行<=60
  • 因?yàn)槟壳暗臄?shù)據(jù)較少,延時隊列加入的只有小部分。所以就在command 里面直接執(zhí)行更新操作了,后期如果隊列多,且有比較耗時的操作,可考慮把耗時操作單獨(dú)放置一個隊列中。本方法只用于將數(shù)據(jù)塞進(jìn)隊列。

附上 shell 腳本 一分鐘執(zhí)行60次

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

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

標(biāo)簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美肉体xxxx裸体137大胆| 91精品综合| 午夜在线精品| 亚洲精品一区二区在线看| 欧美+日本+国产+在线a∨观看| 欧美sss在线视频| 成人羞羞视频播放网站| 亚洲国产专区| 欧美日韩激情| 欧美日韩在线观看首页| 精品三级久久| 伊人成人网在线看| 亚洲精品黄色| 国产欧美88| 久久a爱视频| 91亚洲成人| 99国产精品一区二区| 亚洲国产成人精品女人| 亚洲一区二区三区四区五区午夜| 美女国产精品| 日本不卡视频在线| 欧美激情五月| 精品成人免费一区二区在线播放| 在线成人直播| 免费国产自线拍一欧美视频| 日韩精品视频网| 风间由美中文字幕在线看视频国产欧美| 97欧美在线视频| 午夜久久美女| 日韩av午夜在线观看| 国产精品99久久免费| av高清不卡| 国产日韩综合| 国产精品.xx视频.xxtv| 午夜精品久久久久久久久久蜜桃| 国产91一区| 日本不卡一二三区黄网| 高清久久精品| 伊人久久成人| 国产欧美69| 在线成人动漫av| 日韩国产在线一| 人在线成免费视频| 免费精品视频最新在线| 久久99偷拍| 91成人精品视频| 久久国产麻豆精品| 成人日韩在线观看| 日韩精品免费视频人成| bbw在线视频| 视频一区中文字幕国产| 美日韩一区二区三区| 亚洲精品国产偷自在线观看| 欧美天堂一区二区| 欧美va天堂| 青草av.久久免费一区| 视频二区不卡| 91嫩草精品| 久久中文字幕av| 久久av偷拍| 怡红院精品视频在线观看极品| 国产精品tv| 亚洲天堂日韩在线| 日韩在线观看一区| 国产日韩欧美一区二区三区在线观看| 欧美亚洲在线日韩| 久久精品亚洲| 亚洲视频国产精品| 欧美精选视频一区二区| 国产日韩精品视频一区二区三区| 日韩欧美国产精品综合嫩v| 日韩精品免费一区二区夜夜嗨| 99久久久久| 精品三级在线| 日韩高清不卡在线| 日韩视频一区| 麻豆mv在线观看| 日韩av影院| 午夜在线播放视频欧美| 成人日韩在线观看| 精品资源在线| 日韩精品1区2区3区| 日韩午夜av| 久久三级福利| 色婷婷综合网| 日本亚洲欧洲无免费码在线| 免费观看不卡av| 成人在线免费观看网站| 91精品福利观看| 日韩在线播放一区二区| 999国产精品| 天堂中文在线播放| 国产精品igao视频网网址不卡日韩 | 精品三级久久久| 日韩国产在线观看| 亚洲欧美不卡| 久久人人97超碰国产公开结果| 麻豆极品一区二区三区| 日韩和欧美一区二区| 一区二区三区国产在线| 91成人精品视频| 久久蜜桃精品| 亚洲1234区| 日本高清不卡一区二区三区视频| 精品99在线| 国产精品啊v在线| 国产精品视频首页| 91精品尤物| 日韩激情av在线| 日韩中文字幕一区二区高清99| 国产精品视区| 不卡一区综合视频| 激情婷婷久久| 亚洲欧美综合| 一本色道精品久久一区二区三区| 亚洲大片在线| 亚洲第一精品影视| 欧美 日韩 国产一区二区在线视频 | 亚洲另类黄色| 亚洲a级精品| 日本综合视频| 国产精品外国| 在线国产日韩| 日本麻豆一区二区三区视频| 日韩av一二三| 欧美黑人巨大videos精品| 欧美激情99| 国产不卡av一区二区| 国产粉嫩在线观看| 99成人在线视频| 91久久久久| 美美哒免费高清在线观看视频一区二区| 热久久久久久久| 日本不卡中文字幕| 国产精品www994| 日产精品一区二区| 狠狠久久伊人| 久久婷婷一区| 激情欧美丁香| 免费在线观看一区二区三区| 最新国产精品久久久| 午夜亚洲福利| 国产精品一在线观看| 国产成人1区| 久久婷婷亚洲| 玖玖精品视频| 热久久久久久| 麻豆国产91在线播放| 在线天堂中文资源最新版| 久久天堂精品| 亚洲欧洲美洲国产香蕉| 日韩不卡免费视频| 国内精品麻豆美女在线播放视频| 97在线精品| 亚洲一区二区动漫| 久久国产三级| 国产美女高潮在线| 国产精品日韩久久久| 欧美亚洲tv| 日本不卡免费高清视频在线| 99国产精品自拍| 欧美一区精品| 日本不卡免费高清视频在线| 亚洲一区二区三区免费在线观看 | 日韩一区二区三区精品 | 国产伦精品一区二区三区千人斩 | 日韩1区2区3区| 久久亚洲精品中文字幕| 久久蜜桃资源一区二区老牛| 亚洲一区二区小说| 精品一二三区| 性一交一乱一区二区洋洋av| 国产精品亚洲四区在线观看| 精品欧美一区二区三区在线观看| 日本大胆欧美人术艺术动态| 国产视频一区二| 香蕉精品久久| 国产欧美另类| 亚洲激情五月| 欧美激情日韩| 在线综合亚洲| 久草精品视频| 日韩中文字幕一区二区三区| 久久99精品久久久野外观看| 在线日韩欧美| 国产精品免费不| 日韩一级网站| 国产一区精品福利| 三级在线观看一区二区| 精品久久91| 免播放器亚洲| 国产不卡人人| 欧美综合精品| 亚洲黄页一区| 成人在线视频中文字幕| 婷婷综合一区| 999久久久91| 久久只有精品| 四虎精品一区二区免费| 国产一区日韩欧美|