【问题标题】:PHP - use sleep() after a header redirectPHP - 在标头重定向后使用 sleep()
【发布时间】:2017-09-09 01:19:12
【问题描述】:

我有一个针对商店情况的复杂设置。

人们可以在短时间内购买独特的产品并通过 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()

我现在要采用不同的方法,在结账时保存时间戳,并在商店加载时检查预订时间戳早于十分钟的单位。这应该可行,而且可能更优雅。

但我仍然对上述行为感到困惑,想知道我的推理错误埋在哪里。

【问题讨论】:

标签: php header sleep


【解决方案1】:

这取决于您使用的 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

【讨论】:

  • 我现在在没有 cronjob 的情况下做到了。基本上,每次有人加载商店页面时,我都会更新数据库。工作正常。我只是对执行 header() 之后的所有内容但 header() 本身被延迟感到恼火。感谢您花时间解释!
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多