我有一些酒店预订网站。符合条件的人可以选择酒店、日期和容量并支付订单费用。
当客户做出决定并点击订单按钮时,需要执行几个步骤:
-
再次应用程序检查价格和收集订单信息
-
为客户节省房间以防止超售
-
客户端订单窗口的计时器设置为5分钟(如果时间已过,房间将被释放)
如果客户端离开orger页面,则会触发一个null_timer,并且保存的房间发布
如果客户开始订购(在订单页面中),他就无法购买其他订单
- 触发的
$_SESSION['order_iddle']
和计时器更改通过ajax的客户端
JS触发器
window.onbeforeunload = function(){
timer_null();
return "";
}
PHP检查
if ((!isset($_SESSION['order_iddle'])) || (!$_SESSION['order_iddle']) ) {
header('location: https://home-page/');
}
$_SESSION['order_iddle']
在php中使用计时器进行更新timer_null()
向php发送ajax请求以更新/检查计时器
问题1:
这个逻辑依赖于onbeforeunload()
函数,但如果该函数在某些浏览器中不起作用,我们就会遇到问题。当用户离开订单页面时,是否有更好的方法触发timer_null()
?也许用PHP?
问题2:
当CCD_ 6触发并且用户点击"0"时;停留在页面上";,timer_null()
仍被触发。这有什么关系吗?
谢谢)
一个更好的选择是在后端给订单一个到期值。这样可以避免触发、用户不使用JS时的问题、用户停留在页面上时的问题等。
当他们下订单时,将值设置为当前时间加上分钟数:
$order['expiry'] = time() + (5 * 60); // sets an expiry time for 5 minutes (5x60 seconds)
然后在未来的页面上检查订单是否有效:
if (time() > $order['expiry']) {
throw new Exception('This order is not valid');
}
捕获该异常并将其返回给用户。
更广泛使用的建议
您的用例中可能还有其他东西,例如,需要在这五分钟内持有股票。但是,如果您也将此到期日包含在数据存储中,那么它可以用于检查任何未来订单的到期日。
如果你不想每次下新订单时都检查数千条可能过期的记录,你可以创建一种"清理"脚本来自动运行。如果你以前没有使用过crontab
,我建议你仔细阅读一下,而是使用crontab在每天午夜运行一个脚本:
0 0 * * * php /var/www/my-clean-up-script.php
然后在脚本本身(伪代码)中:
$expired_orders = database_query ( GET orders FROM table WHERE expired_time < current_time)
for each $expired_orders
database_query ( DELETE order)
它应该适用于任何可查询的数据存储。