【发布时间】: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