【问题标题】:Prevent PHP File from running mulitple time at once防止 PHP 文件一次运行多次
【发布时间】:2017-05-02 21:57:16
【问题描述】:

我每天通过使用 PHP 访问一个 URL 来扣除我的用户付款。扣款的具体时间没有规定。所以我没有使用 cron 来执行这项工作。所以我从我的浏览器调用这个 php 文件来扣除付款。但问题是在输入我的 php 文件的 url 时,浏览器会自动点击它。当我点击 url 时。有时付款会被扣除两次。我怎么解决这个问题 。 如果它的实例正在运行,我还使用以下代码来防止 php 文件运行:-

文件开始:-

$fp = fopen(__FILE__, "r");
if (flock($fp, LOCK_EX | LOCK_NB)) {
    echo "Got lock!\n";


} else {
    print "Could not get lock!\n";
}

文件结束:-

 flock($fp, LOCK_UN);

但它不起作用。请帮我解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 您需要有一个数据库来跟踪用户执行了哪些付款,并让您的脚本在继续进行新的收费之前先检查这一点。
  • 使用缓存机制(redis/memcached/Php 对象)来存储和更新会话并维护事务的状态。
  • 您需要在某处存储此日常任务正在进行中或今天已经完成。使用数据库跟踪状态,您可以使用 Cron 安排何时执行。我提到数据库是因为您可以构建一个裸 ui 并与脚本进行交互。
  • @LucasKrupinski,它不会工作。我正在运行 select * from BillAsyncLogs ,其中 Process_Flag=0 和 BillResFinal 不为 null 并且 source in ('rgrace','fgrace','renewal') 。此查询返回大约 1000 个结果。处理这些结果大约需要 30 到 35 分钟。处理完每条记录后,我将 process_flag 更新为 1 。但我仍然没有解决问题。假设我运行了第一个返回 1011 结果的文件实例,第二个实例返回 1005 结果。现在即使一审已经处理了一条记录。第二个将再次处理记录。
  • 您将需要像在某些支付 API 中那样建立一个不可靠的系统:stripe.com/docs/api?lang=php#idempotent_requests

标签: php curl


【解决方案1】:

您应该简单地将__FILE__ 替换为/tmp/my-php-script.lock 之类的其他内容,即:

$fp = fopen("/tmp/my-php-script.lock", "r");

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2012-11-29
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多