注意:我这里只是演示代码,单纯为了展示实现过程。
1、接收订单,处理订单order.php
<?php
// 这个文件是用来接收用户的订单信息 并写入队列的一个文件
if(!empty($_GET['user_info'])){
// 验证 过滤 接收的数据
// todo...
// 这里是应该首先是订单中心的处理流程
// 因为订单系统是一套单独的系统 这里就不编写这个系统了
// todo...
$order_id = rand(100000,99999); // 正常的订单号从 订单系统来,我们这里只是演示
// 把配送系统需要的订单数据存入队列表中
$insert_data = array(
'order_id'=>$order_id,
'user_info'=>$_GET['user_info'],
'created_at'=>date('Y-m-d H:i:s',time()),
'status'=>0
);
// 把上面的数据 插入到order_queue表中
// insert into order_queue
}
2、配送系统goods.php
<?php
// 这个文件主要是配送系统处理队列表中的订单并进行标记的文件
//分析:
//第一步:先把要处理的记录更新为『等待处理』
//第二步:选择刚刚标记为『等待处理』的记录,然后进行配送系统的处理
//第三步:把上面前面处理过的程序标记『已完成』
/////////////////////这里很重要,你一定要明白哦//////////////////////////////////////////////
//疑问:为什么不直接处理最后更新为『已完成』,多了先标记为『等待处理』?
//这是因为配送系统很可能不是及时完成的,它中间会有一段处理的时间,如果还在处理中有其他程序来进行读取和操作,就冲突了。
//这样设计其实也是一个锁的机制
//1、
$waiting = array('status'=>0);
$lock = array('status'=>2);
//把状态为0的记录标记为2,每次更新3条(具体每次几条看情况)
$sql = "update order_queue set status=2 where status=0 limit 3";
//2、
if(上面update成功){
// 选择出要处理订单内容
// select * from order_queue where status = 2;
// 然后由配货系统进行处理
// todo...
//3、处理完成把订单状态更新为已完成
$success = array(
'status'=>1,
'updated_at'=>date('Y-m-d H:i:s',time())
);
}else{
echo 'All Finished';
}
3、linux服务器 定时任务
写个shell脚本:goods.sh
#!/bin/bash date "+%G-%m-%d %H:%M:%S" cd /var/www/ php goods.php
这个脚本就是去执行orders.php这个程序的。
在linux服务器部署定时任务:
crontab -e */1 * * * * /var/www/goods.sh >> /var/www/goods_shell.log 2>$1
每分钟执行一次goods.sh文件,并记录日志到goods_shell.log文件(在对应目录新建该文件)
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》
