防止PHP文件一次运行多次

防止PHP文件一次运行多次,php,curl,Php,Curl,我通过使用PHP点击一个url来扣减我的用户每天的付款。没有具体的付款时间。所以我没有使用cron来执行这项工作。所以我从浏览器中调用这个php文件来扣除付款。但问题是,当输入我的php文件的url时,浏览器会自动点击它。当我点击网址时。有时付款要扣除两次。我怎样才能解决这个问题。 我还使用了以下代码来防止php文件在其实例正在运行时运行:- 文件开头:- $fp = fopen(__FILE__, "r"); if (flock($fp, LOCK_EX | LOCK_NB)) { e

我通过使用PHP点击一个url来扣减我的用户每天的付款。没有具体的付款时间。所以我没有使用cron来执行这项工作。所以我从浏览器中调用这个php文件来扣除付款。但问题是,当输入我的php文件的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);
文件结尾:-

$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);

但它不起作用。请帮助我解决此问题。如有任何帮助,我们将不胜感激。

您只需将
\uuuuuu文件\uuuuuuuu
替换为类似
/tmp/my php script.lock的其他内容即可,即:

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

您需要有一个数据库来跟踪用户已执行的付款,并让您的脚本在继续进行新的收费之前先进行检查。使用缓存机制(redis/memcached/Php对象)来存储和更新会话,并维护事务的状态。您需要存储在某个位置,该日常任务正在进行中或今天已完成。使用数据库跟踪状态,您可以使用Cron计划何时执行。我之所以提到数据库,是因为您可以构建一个简单的ui并与脚本交互。@LucasKrupinski,它不会工作。我正在从BillAsyncLogs运行select*,其中Process_Flag=0,BillResFinal不为null,source在('rgrace','fgrace','renewal')。此查询返回大约1000个结果。处理这些结果大约需要30到35分钟。处理每个记录后,我将process_标志更新为1。但我仍然没有解决这个问题。假设我运行文件的第一个实例,它返回1011个结果,第二个实例返回1005个结果。现在,即使第一个实例已经处理了一条记录。Second将再次处理该记录。您需要创建一个类似于某些支付API中的不确定系统: