700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 这次用swoole实现订单延时 还原库存!

这次用swoole实现订单延时 还原库存!

时间:2023-03-31 09:43:36

相关推荐

这次用swoole实现订单延时 还原库存!

php框架|Swoole

swoole

php框架-Swoole

智能建站源码,ubuntu增加用户权限,值得爬虫的网站,php apex,汽车seo构思lzw

A、业务场景:当客户下单在指定的时间内如果没有付款,那我们需要将这笔订单取消掉,比如好的处理方法是运用延时取消,很多人首先想到的当然是crontab,这个也行,不过这里我们运用swoole的异步毫秒定时器来实现,同样也不会影响到当前程序的运行。

文章管理php源码,前端idea和vscode,ubuntu 迅雷替代,dos 停止tomcat,sqlite编辑器pc,爬虫零基础学习书籍推荐,php 获取所有key,seo162磁力,用wampserver搭建网站,静态网页制作网站,appcms下载站模板lzw

B、说明,order_status为1时代表客户下单确定,为2时代表客户已付款,为0时代表订单已取消(正是swoole来做的)

国外视频网站源码,vscode 写vue,ubuntu启动进入不了系统,tomcat显示列表,sqlite需要配置马,百度统计图表插件,boot前端快速开发框架,爬虫专家斯蒂夫,PHP安装热水器,福州seo顾问培训,二手车源码网站,网页背景图片自动切换,视频播放器联系我们模板,ecshop分类页面直接入购物车,php用户管理系统源码带api,在线文档程序源码lzw

C、举例说明,库存表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),客户又可以继续下单了

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 .00, `user_name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT \, `order_status` tinyint(2) unsigned NOT NULL DEFAULT , `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 , `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, -09-13 19:36:19);INSERT INTO `csdn_product_stock` VALUES (2, 2, 40, -09-13 19:36:19);

下面贴出来纯手工PHP,很多同学用了原生PHP,就不会运用到框架里去,其实都一样的,不要想得那么复杂就是了。只要一点就是你用多了,你就会这样觉得咯。

配置文件config.php ,这个在框架的话,基本上都是配置好了。

swoole都是用在linux系统里的,这里的host你可以自己搭建虚拟主机,也可以网上购买属于自己的服务器

订单提交的文件order_submit.php,这里对订单生成,同时扣除库存的一系列操作

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 => ow(), product_lit => array( 0 => array(product_id => 1,product_price => 5.00,product_number => 10,date_created => ow() ), 1 => array(product_id => 2,product_price => 5.92,product_number => 20,date_created => ow() ) ) ); 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] prepare($sqlProductStock); $stmtProductStock->execute(array(:productNumber => $productInfo[product_number], :productId => $productInfo[product_id])); $affectedRowsProductStock = $stmtProductStock->rowCount(); //库存没有正常扣除,失败,库存表里的product_stock_number设置了为非负数 //如果库存不足时,sql异常:SQLSTATE[2]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in (`test`.`csdn_product_stock`.`product_stock_number` - 20) if($affectedRowsProductStock 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

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" . "end\t" . 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);}?>

更多swoole技术文章,请访问swoole教学栏目!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。