php記錄一次未支付訂單過期處理的辦法

訂單是我們?cè)谌粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能辐真,最近在做業(yè)務(wù)的時(shí)候需要實(shí)現(xiàn)客戶下單之后訂單超時(shí)未支付自動(dòng)取消的功能,剛開始確認(rèn)了幾種方法:

  • 客戶端到時(shí)間請(qǐng)求取消
  • 服務(wù)端定時(shí)查詢有沒有需要取消的訂單,然后批量處理
  • 下單后創(chuàng)建定時(shí)器适滓,延時(shí)處理
  • 使用redis或者memcache存儲(chǔ)仆邓,設(shè)置過期時(shí)間鳖擒,自動(dòng)刪除

上面的方法相信很多人都很熟悉了绳匀,雖然不熟悉也看過很多它的知識(shí)了吧芋忿,所以就不多廢話了炸客。今天要說的是第三種方法疾棵,為了防止進(jìn)程進(jìn)入阻塞,所以需要借助Swoole痹仙,workerman這樣的框架來開啟異步的定時(shí)器是尔,今天講解的是如何利用Swoole來處理訂單過期時(shí)間。

環(huán)境要求

  • 安裝swoole擴(kuò)展 安裝請(qǐng)參考swoole官網(wǎng)里面有詳細(xì)的安裝教程
  • 配置php.ini開啟proc_open

swoole一次性定時(shí)器swoole_timer_after

官網(wǎng)介紹如下:

woole_timer_after函數(shù)是一個(gè)一次性定時(shí)器开仰,執(zhí)行完成后就會(huì)銷毀拟枚。此函數(shù)與PHP標(biāo)準(zhǔn)庫(kù)提供的sleep函數(shù)不同薪铜,after是非阻塞的。而sleep調(diào)用后會(huì)導(dǎo)致當(dāng)前的進(jìn)程進(jìn)入阻塞恩溅,將無法處理新的請(qǐng)求隔箍。

執(zhí)行成功返回定時(shí)器ID,若取消定時(shí)器蜀铲,可調(diào)用 swoole_timer_clear

實(shí)現(xiàn)邏輯

image

完整代碼

開啟定時(shí)器

/*
 *開啟定時(shí)器
 *id 訂單id
 */
public function openTimer($id)
    {
        $arr = ['order_id' => $id];
        $json = base64_encode(json_encode($arr));
        //處理訂單過期請(qǐng)求的地址
        $path = Config::get('order.past_order_url');
        // 定時(shí)器腳本路徑
        $address = Config::get('order.timer_url');
        $cmd = "php Timer.php -a 1 -u {$path} -p {$json} -t 1800000";
        $descriptorspec = array(
            0 => ["pipe", "r"],
            1 => ["pipe", "w"],
            2 => ["file", "{$address}/error.txt", "a"]
        );
        proc_open($cmd, $descriptorspec, $pipes, $address, NULL);
        return true;
    }

Timer.php

class Timer
{
    public $request_url = null;

    public $params = [];

    public $time = 1000;

    public function __construct()
    {
        $param_arr = getopt('a:u:p:t:');
        if (!isset($param_arr['a'])) {
            $this->writeLog('【傳參錯(cuò)誤】操作類型不能為空', 2);
            die;
        }

        if (!isset($param_arr['u'])) {
            $this->writeLog('【傳參錯(cuò)誤】請(qǐng)求url不能為空', 2);
            die;
        }

        if ((isset($param_arr['t']) && $param_arr['t'] < 1000)) {
            $this->writeLog('【傳參錯(cuò)誤】時(shí)間不能小于1000毫秒', 2);
            die;
        }

        if (isset($param_arr['p']) && !is_string($param_arr['p'])) {
            $this->writeLog('【傳參錯(cuò)誤】請(qǐng)求參數(shù)必須是字符串', 2);
            die;
        }

        $this->request_url = $param_arr['u'];

        isset($param_arr['t']) && $this->time = $param_arr['t'];


        isset($param_arr['p']) && $this->params = ['data' => $param_arr['p']];

        if ($param_arr['a'] == 1) {
            $this->timer_after();
        }
    }

    /**
     * 一次性定時(shí)器
     * Created by 李果 En:AdoSir <1334435738@qq.com>
     * @return int
     */
    public function timer_after()
    {
        $id = swoole_timer_after($this->time, function () {
            //邏輯處理更具自己情況棒拂。我的解決方案是請(qǐng)求一個(gè)地址處理訂單過期
            $result = $this->cu($this->request_url, json_encode(['data' => $this->params]));
            $this->writeLog("請(qǐng)求URL返回:code:{$result['httpCode']}炒俱;response:{$result['response']}", 1);
        });
        $this->writeLog("添加定時(shí)器【id】:{$id}【參數(shù)】:" . json_encode($this->params), 1);
        return $id;
    }

    /**
     * 發(fā)起請(qǐng)求
     * @param $url
     * @param array $jsonStr
     * @return array
     */
    public function cu($url, $jsonStr = [])
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/json; charset=utf-8',
                'Content-Length: ' . strlen($jsonStr),
            ]
        );
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return ['httpCode' => $httpCode, 'response' => $response];
    }

    /**
     * 寫入日志
     * @param $msg
     * @param int $type
     */
    public function writeLog($msg, $type = 1)
    {
        //date_default_timezone_set("Asia/Shanghai");
        $day = date('Ymd');
        $file = $type == 1 ? "./log-{$day}.txt" : "./error-{$day}.txt";
        file_put_contents($file, "\r\n" . date("Y - m - d h:i:s") . ': ' . $msg, FILE_APPEND | LOCK_EX);
    }

}

new Timer();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俯艰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锌订,老刑警劉巖竹握,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辆飘,居然都是意外死亡啦辐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜈项,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昧甘,“玉大人,你說我怎么就攤上這事战得〕浔撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵常侦,是天一觀的道長(zhǎng)浇冰。 經(jīng)常有香客問我,道長(zhǎng)聋亡,這世上最難降的妖魔是什么肘习? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮坡倔,結(jié)果婚禮上漂佩,老公的妹妹穿的比我還像新娘。我一直安慰自己罪塔,他們只是感情好投蝉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著征堪,像睡著了一般瘩缆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佃蚜,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天庸娱,我揣著相機(jī)與錄音着绊,去河邊找鬼。 笑死熟尉,一個(gè)胖子當(dāng)著我的面吹牛归露,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斤儿,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼靶擦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了雇毫?” 一聲冷哼從身側(cè)響起玄捕,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚放,沒想到半個(gè)月后枚粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飘蚯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年馍迄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局骤。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攀圈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峦甩,到底是詐尸還是另有隱情赘来,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布凯傲,位于F島的核電站犬辰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冰单。R本人自食惡果不足惜幌缝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诫欠。 院中可真熱鬧涵卵,春花似錦、人聲如沸荒叼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甩挫。三九已至贴硫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伊者,已是汗流浹背英遭。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亦渗,地道東北人挖诸。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像法精,于是被迫代替她去往敵國(guó)和親多律。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • swoole 安裝用的是centOSphp安裝目錄:/usr/local/php php.ini配置文件路徑:/u...
    a十二_4765閱讀 11,833評(píng)論 3 9
  • 我家住在飛機(jī)場(chǎng)附近搂蜓,天天看著飛機(jī)起飛和降落狼荞。我實(shí)在想親身體會(huì)一次坐飛機(jī)的感受。 媽媽決定今年...
    靜思_de8d閱讀 307評(píng)論 0 0
  • 人類所有的仇恨帮碰,大概源自于欲望與貪婪 單純善良一類的詞相味,聽起來真是諷刺 內(nèi)心的黑暗,因貪婪和縱容而滋生殉挽,因欺騙與傷...
    神傷_難道閱讀 511評(píng)論 0 0
  • 一 曾經(jīng)有一段閉封的日子丰涉。 嘗試過幾個(gè)周都不跟別人交流。 感覺自己像個(gè)原始人斯碌,真的一死。看到以前很好的朋友傻唾,一起坐在操...
    木澤_閱讀 523評(píng)論 0 1