我对商店情况有一个复杂的设置。
人们可以在短时间内购买独特的产品,并通过PayPal付款。
所以我需要确保产品不会多次购买。出于此目的,我在结帐时使用自定义PHP文件,将数据库中的项目更新为“保留”状态,然后通过header()
将表单发送到PayPal。这一切都很好。
由于我们销售的商品数量有限且时间有限,如果买家中止付款流程,我想再次提供商品。我确实设置并运行了PDT,但事务协议有时会延迟延迟。 结账后十分钟,我想检查数据库,看看交易是否通过。如果该商品确实已售出(状态由PDT脚本更改)一切正常,如果没有售出,我想重置预订状态并再次为其他买家提供商品。
以下是我的代码设置:
if ($resstatus == "0"){
$result = mysqli_query($mysqli, "UPDATE `table` SET `Reserved`='1' WHERE `AID`='$AID' AND `itemID`='$itemD1'");
header('Location: https://www.paypal.com/cgi-bin/webscr?'.$post_string);
sleep(600); //wait ten minutes before checking DB
if ($sold == "0"){
$reset = mysqli_query($mysqli, "UPDATE `table` SET `Reserved`='0' WHERE `AID`='$AID' AND `itemID`='$itemD1'");
}
}
所有内容都已执行,但标题重定向也会延迟sleep()
中定义的时间跨度。这对我来说根本没有意义。如果它会重定向并且之后不执行任何操作 - 这是一回事。但它会执行所有操作,但行为就像订单首先sleep()
然后header()
一样。
我现在采用不同的方法,通过在结帐时保存时间戳并检查商店加载时预订时间戳超过十分钟的单位。这应该工作,可能更优雅。
但是我仍然对上述行为感到困惑,并且想知道我的推理错误在哪里被埋没。
答案 0 :(得分:0)
这取决于您使用的SAPI。然而,你不能指望执行睡眠后的代码,并且应该使用一个cron作业来检查时间戳并删除保留。
特别是因为你有这么大的超时,服务器可能会终止长时间运行的脚本。此外,您的脚本在睡觉时也会绑定其中一个可用于提供其他内容的进程。
顺便说一句,这可能有用:ob_start();
header('Location: https://www.paypal.com/cgi-bin/webscr?'.$post_string);
ob_end_flush();
flush();
ob_end_clean();
sleep(600);
另见here