久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

這次我用swoole實現訂單延時,還原庫存!

這次我用swoole實現訂單延時,還原庫存!

一、業務場景:當客戶下單在指定的時間內如果沒有付款,那我們需要將這筆訂單取消掉,比如好的處理方法是運用延時取消,很多人首先想到的當然是crontab,這個也行,不過這里我們運用swoole的異步毫秒定時器來實現,同樣也不會影響到當前程序的運行。

二、說明,order_status為1時代表客戶下單確定,為2時代表客戶已付款,為0時代表訂單已取消(正是swoole來做的)

三、舉例說明,庫存表csdn_product_stock產品ID為1的產品庫存數量為20,產品ID為2的庫存數量為40,然后客戶下單一筆產品ID1減10,產品ID2減20,所以庫存表只夠2次下單,例子中10秒后自動還原庫存。

如下圖,圖解:

1、第一次下完單產品ID1庫存從20減到了10,產品ID2庫存從40減到了20;2、第二次下完單產品ID的庫存為0了,產品ID2的庫存也為0了,

3、第三次下單時,程序提示Out of stock;

4、過了10秒鐘(每個訂單下單后往后推10秒),客戶兩次下單,由于沒有付款(csdn_order表的order_status為1),產品1和產品2的庫存被還原了(csdn_order表的order_status變為0),客戶又可以繼續下單了

這次我用swoole實現訂單延時,還原庫存!

1、所需要sql數據庫表

DROP TABLE IF EXISTS `csdn_order`; CREATE TABLE `csdn_order` (   `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `order_amount` float(10,2) unsigned NOT NULL DEFAULT '0.00',   `user_name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT '',   `order_status` tinyint(2) unsigned NOT NULL DEFAULT '0',   `date_created` datetime NOT NULL,   PRIMARY KEY (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `csdn_order_detail`; CREATE TABLE `csdn_order_detail` (   `detail_id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `order_id` int(10) unsigned NOT NULL,   `product_id` int(10) NOT NULL,   `product_price` float(10,2) NOT NULL,   `product_number` smallint(4) unsigned NOT NULL DEFAULT '0',   `date_created` datetime NOT NULL,   PRIMARY KEY (`detail_id`),   KEY `idx_order_id` (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `csdn_product_stock`; CREATE TABLE `csdn_product_stock` (   `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `product_id` int(10) NOT NULL,   `product_stock_number` int(10) unsigned NOT NULL,   `date_modified` datetime NOT NULL,   PRIMARY KEY (`auto_id`),   KEY `idx_product_id` (`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `csdn_product_stock` VALUES ('1', '1', '20', '2018-09-13 19:36:19'); INSERT INTO `csdn_product_stock` VALUES ('2', '2', '40', '2018-09-13 19:36:19');

下面貼出來純手工PHP,很多同學用了原生PHP,就不會運用到框架里去,其實都一樣的,不要想得那么復雜就是了。只要一點就是你用多了,你就會這樣覺得咯。

配置文件config.php ,這個在框架的話,基本上都是配置好了。

<?php $dbHost = "192.168.23.110"; $dbUser = "root"; $dbPassword = "123456"; $dbName = "test"; ?>

swoole都是用在linux系統里的,這里的host你可以自己搭建虛擬主機,也可以網上購買屬于自己的服務器

訂單提交的文件order_submit.php,這里對訂單生成,同時扣除庫存的一系列操作

<?php require("config.php"); try {     $pdo = new PDO("mysql:host=" . $dbHost . ";dbname=" . $dbName, $dbUser, $dbPassword, array(PDO::ATTR_PERSISTENT => true));     $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     $orderInfo = array(         'order_amount' => 10.92,         'user_name' => 'yusan',         'order_status' => 1,         'date_created' => 'now()',         'product_lit' => array(             0 => array(                 'product_id' => 1,                 'product_price' => 5.00,                 'product_number' => 10,                 'date_created' => 'now()'             ),             1 => array(                 'product_id' => 2,                 'product_price' => 5.92,                 'product_number' => 20,                 'date_created' => 'now()'             )         )     );     try{         $pdo->beginTransaction();//開啟事務處理         $sql = 'insert into csdn_order (order_amount, user_name, order_status, date_created) values (:orderAmount, :userName, :orderStatus, now())';         $stmt = $pdo->prepare($sql);           $affectedRows = $stmt->execute(array(':orderAmount' => $orderInfo['order_amount'], ':userName' => $orderInfo['user_name'], ':orderStatus' => $orderInfo['order_status']));         $orderId = $pdo->lastInsertId();         if(!$affectedRows) {             throw new PDOException("Failure to submit order!");         }         foreach($orderInfo['product_lit'] as $productInfo) {             $sqlProductDetail = 'insert into csdn_order_detail (order_id, product_id, product_price, product_number, date_created) values (:orderId, :productId, :productPrice, :productNumber, now())';             $stmtProductDetail = $pdo->prepare($sqlProductDetail);               $stmtProductDetail->execute(array(':orderId' => $orderId, ':productId' =>  $productInfo['product_id'], ':productPrice' => $productInfo['product_price'], ':productNumber' => $productInfo['product_number']));             $sqlCheck = "select product_stock_number from csdn_product_stock where product_id=:productId";               $stmtCheck = $pdo->prepare($sqlCheck);               $stmtCheck->execute(array(':productId' => $productInfo['product_id']));               $rowCheck = $stmtCheck->fetch(PDO::FETCH_ASSOC);             if($rowCheck['product_stock_number'] < $productInfo['product_number']) {                 throw new PDOException("Out of stock, Failure to submit order!");             }             $sqlProductStock = 'update csdn_product_stock set product_stock_number=product_stock_number-:productNumber, date_modified=now() where product_id=:productId';             $stmtProductStock = $pdo->prepare($sqlProductStock);               $stmtProductStock->execute(array(':productNumber' => $productInfo['product_number'], ':productId' => $productInfo['product_id']));             $affectedRowsProductStock = $stmtProductStock->rowCount();             //庫存沒有正常扣除,失敗,庫存表里的product_stock_number設置了為非負數             //如果庫存不足時,sql異常:SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in '(`test`.`csdn_product_stock`.`product_stock_number` - 20)'             if($affectedRowsProductStock <= 0) {                 throw new PDOException("Out of stock, Failure to submit order!");             }         }         echo "Successful, Order Id is:" . $orderId .",Order Amount is:" . $orderInfo['order_amount'] . "。";         $pdo->commit();//提交事務         //exec("php order_cancel.php -a" . $orderId . " &");         pclose(popen('php order_cancel.php -a ' . $orderId . ' &', 'w'));         //system("php order_cancel.php -a" . $orderId . " &", $phpResult);         //echo $phpResult;     }catch(PDOException $e){         echo $e->getMessage();         $pdo->rollback();     }     $pdo = null; } catch (PDOException $e) {     echo $e->getMessage(); } ?>

訂單的延時處理order_cancel.php

<?php require("config.php"); $queryString = getopt('a:'); $userParams = array($queryString); appendLog(date("Y-m-d H:i:s") . "t" . $queryString['a'] . "t" . "start"); try {     $pdo = new PDO("mysql:host=" . $dbHost . ";dbname=" . $dbName, $dbUser, $dbPassword, array(PDO::ATTR_PERSISTENT => true));     $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     swoole_timer_after(10000, function ($queryString) {         global $queryString, $pdo;         try{             $pdo->beginTransaction();//開啟事務處理             $orderId = $queryString['a'];               $sql = "select order_status from csdn_order where order_id=:orderId";               $stmt = $pdo->prepare($sql);               $stmt->execute(array(':orderId' => $orderId));               $row = $stmt->fetch(PDO::FETCH_ASSOC);             //$row['order_status'] === "1"代表已下單,但未付款,我們還原庫存只針對未付款的訂單             if(isset($row['order_status']) && $row['order_status'] === "1") {                 $sqlOrderDetail = "select product_id, product_number from csdn_order_detail where order_id=:orderId";                   $stmtOrderDetail = $pdo->prepare($sqlOrderDetail);                   $stmtOrderDetail->execute(array(':orderId' => $orderId));                   while($rowOrderDetail = $stmtOrderDetail->fetch(PDO::FETCH_ASSOC)) {                     $sqlRestoreStock = "update csdn_product_stock set product_stock_number=product_stock_number + :productNumber, date_modified=now() where product_id=:productId";                       $stmtRestoreStock = $pdo->prepare($sqlRestoreStock);                     $stmtRestoreStock->execute(array(':productNumber' => $rowOrderDetail['product_number'], ':productId' => $rowOrderDetail['product_id']));                 }                 $sqlRestoreOrder = "update csdn_order set order_status=:orderStatus where order_id=:orderId";                   $stmtRestoreOrder = $pdo->prepare($sqlRestoreOrder);                 $stmtRestoreOrder->execute(array(':orderStatus' => 0, ':orderId' => $orderId));             }             $pdo->commit();//提交事務         }catch(PDOException $e){             echo $e->getMessage();             $pdo->rollback();         }         $pdo = null;         appendLog(date("Y-m-d H:i:s") . "t" . $queryString['a'] . "t" . "endt" . json_encode($queryString));     }, $pdo); } catch (PDOException $e) {     echo $e->getMessage(); } function appendLog($str) {     $dir = 'log.txt';     $fh = fopen($dir, "a");     fwrite($fh, $str . "n");     fclose($fh); } ?>

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产日产精品_国产精品毛片 | 亚洲成人av观看| 日本精品另类| 日韩高清一区在线| 麻豆极品一区二区三区| 欧美日中文字幕| 中文另类视频| 日韩中文字幕| 国产日韩1区| 亚洲精品乱码| 国产午夜久久av| 亚洲欧美日韩在线观看a三区| 视频精品一区二区| 蜜桃久久av一区| 每日更新成人在线视频| 欧美好骚综合网| 午夜久久福利| 国产精品久久久久av蜜臀 | 美国三级日本三级久久99 | 99视频精品全国免费| 老司机免费视频一区二区| 国产精品欧美三级在线观看| 欧美日韩在线观看视频小说| 亚洲欧美久久| 久久高清精品| 亚洲综合专区| 国产成人精品一区二区三区在线| 综合在线一区| 久久精品国内一区二区三区| 亚洲激情不卡| 久久福利一区| 韩国久久久久久| 亚洲综合福利| 亚洲播播91| 亚洲一区二区成人| 日本成人在线不卡视频| 欧美天堂亚洲电影院在线观看| 少妇精品久久久一区二区| 久久激情网站| 中国女人久久久| 亚洲人成网77777色在线播放| 精品淫伦v久久水蜜桃| 99精品99| 美女av在线免费看| 欧美日韩xxxx| 欧美日韩精品免费观看视完整| 亚洲精品一级| 国产美女视频一区二区| 日本精品影院| 久久精品国产亚洲aⅴ| 日韩视频网站在线观看| 欧美日韩国产在线一区| 亚洲精品极品少妇16p| 亚洲欧美视频| 国产伦精品一区二区三区在线播放| 精品国产精品国产偷麻豆| 麻豆成人91精品二区三区| 美女视频黄 久久| 国产麻豆精品久久| av亚洲在线观看| 欧美精品国产白浆久久久久| 国产精品jk白丝蜜臀av小说| 免费成人网www| 成人羞羞在线观看网站| 成年男女免费视频网站不卡| 欧美精品成人| 久久99蜜桃| 国产成人精品一区二区三区视频| 亚洲欧美日本日韩| 91精品一区国产高清在线gif| 电影亚洲精品噜噜在线观看| 国产精品传媒麻豆hd| 136国产福利精品导航网址| 国产亚洲高清视频| 久久精品免费一区二区三区 | 国产在线日韩| 亚洲爱爱视频| 日韩精品一页| 国产精品视频一区视频二区| 久久永久免费| 日本精品国产| 日本欧美大码aⅴ在线播放| 福利在线免费视频| 美日韩一区二区三区| 精品国产亚洲一区二区在线观看| 国产福利资源一区| 欧美亚洲色图校园春色| 国产精品久久久久久av公交车 | 日本国产亚洲| 国产区精品区| 最新国产精品| 久久99精品久久久久久园产越南 | 麻豆视频一区| 日韩一区二区三区高清在线观看| av中文资源在线资源免费观看| 国产精品中文字幕亚洲欧美 | 欧美日韩一区二区三区视频播放| 久久xxxx| 国产免费av国片精品草莓男男| 亚洲国产欧美日本视频| 最新中文字幕在线播放 | 国产精品mv在线观看| 综合激情一区| 自拍日韩欧美| 日韩高清一区二区| 国产日韩欧美| 99久久亚洲精品| 四虎影视精品| 国产亚洲欧美日韩精品一区二区三区 | 国产乱人伦丫前精品视频| 欧美精品成人| 久久中文字幕av| 精品午夜av| 久久国产日韩欧美精品| 日韩高清不卡| 亚洲性视频h| 久色成人在线| 亚洲女同中文字幕| 水野朝阳av一区二区三区| 欧洲亚洲一区二区三区| 色偷偷偷在线视频播放| 亚洲一区二区三区免费在线观看| 亚洲人成高清| 欧美粗暴jizz性欧美20| 麻豆国产精品| 国产乱子精品一区二区在线观看 | 久久精品国产免费| 亚洲欧美高清| 亚洲先锋成人| 欧美日一区二区三区在线观看国产免 | 亚洲综合色婷婷在线观看| 91成人精品| 日韩精品社区| 国产精品久久久久9999高清| 久久av免费| 电影91久久久| 亚洲精品中文字幕99999| 性色一区二区| 亚洲一区二区毛片| 三级欧美韩日大片在线看| 欧美精品一二| 精品网站999| 日韩在线高清| 日韩视频免费| 欧美天堂一区| 9999国产精品| 日韩在线播放一区二区| 91精品丝袜国产高跟在线| 日韩免费福利视频| 午夜国产精品视频免费体验区| 亚洲欧美日韩在线观看a三区| 亚洲三级av| 奇米亚洲欧美| 午夜久久av | 黄色在线一区| 成人羞羞视频播放网站| 国产一级一区二区| 国产精品久久久久av电视剧| 色婷婷久久久| 精品在线91| 五月天激情综合网| 美女网站一区| 亚洲深夜av| 亚洲精品成人一区| 国产三级精品三级在线观看国产| 亚洲一区中文| 欧美精品资源| 亚洲精品日韩久久| 玖玖精品视频| 久久久男人天堂| 国产精品3区| 亚洲小说欧美另类婷婷| 国产精品毛片aⅴ一区二区三区| 色综合www| 亚洲在线网站| 国产高清久久| 国产精品v日韩精品v欧美精品网站 | 三级亚洲高清视频| 欧美日韩国产亚洲一区| 国产精品视频一区二区三区四蜜臂| 亚洲bt欧美bt精品777| 国产精品色网| 亚洲另类av| 国产精品s色| 日韩一区二区三区免费视频| 欧美在线综合| 欧美高清一区| 久久精品国产久精国产| 国产欧美高清| 中文字幕色婷婷在线视频| 黄毛片在线观看| 日韩精品高清不卡| 亚洲一区二区网站| 亚洲日本欧美| 欧美高清不卡| 天堂俺去俺来也www久久婷婷| 国产精品va视频| 亚洲一级在线| 婷婷激情综合| 免费精品一区|