多次调用API会使脚本运行速度过快,导致第一个脚本在下一个脚本启动之前完成

时间:2017-06-09 17:57:34

标签: php jquery sql locking

我有一个从API调用的脚本。我遇到的问题是脚本在很短的时间内被调用了太多次,有时是1/1000秒。在我的脚本中,我有sql查询,根据某人安排播放列表的时间进行一些删除和更新。

流程如下:

  • 添加尽可能多的播放列表
  • 点击“保存播放列表时间表”'按钮。
  • 对每个创建的播放列表使用API​​调用。

似乎很简单,但是,如果创建了2个或更多播放列表(然后进行了2个或更多API调用),则查询不会线性运行,因此数据库不会更改为所需的数字。< / p>

我已经编辑了Jquery每次睡眠一秒钟,以确保这是问题所在,但是,我不想限制此API调用的频率。

我试图在运行的脚本的最开头在php中创建一个类似的锁文件:

 # -----ENSURES USERS DON'T CALL THE API TOO MANY TIMES---------
        # Check lock file so someone can't overwrite database before edits are done.
        do
        {
            $file = fopen('playlist_lock.txt', 'w+');
            if (fgets($file) == 0) // 0 being unlocked, 1 being locked
            {
                fwrite($file, '1');
                fclose($file);
                break;
            }
            usleep(10000);
        }
        while ($is_locked);

然后在文件的最后,我添加:

fwrite($file, '0');
fclose($file);

然而,这似乎不起作用。它似乎可以降低调用超过4个左右所引起的问题,但对于初始的3或4仍然存在问题。意思是,我认为文件写入速度不够快,无论是否锁定其他调用还没有。

有人能引导我朝正确的方向前进吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是使用两个文件名来检查/更改锁定状态,而不是从同一个文件读取/写入。以下是示例代码:

$locked = 'playlist_lock.txt';
$unlocked = 'playlist_unlock.txt';

if (!file_exists($unlocked) && !file_exists($locked)){
    file_put_contents($unlocked, '1');
}

do {

    if (file_exists($unlocked)){
        rename($unlocked, $locked); // lock if it is unlocked
        break;
    }

    usleep(10000);

} while ($is_locked);

然后在文件的最后:

rename($locked, $unlocked); // unlock

<强>更新

也许,最好手动创建playlist_unlock.txt,而不是每次脚本运行时检查它是否存在。这样就可以删除这段代码:

if (!file_exists($unlocked) && !file_exists($locked)){
    file_put_contents($unlocked, '1');
}