对 API 的多次调用运行脚本的速度太快,以至于第一个脚本无法在下一个脚本开始之前完成



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

流程如下:

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

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

我每次都编辑 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 个仍然有问题。意思是,我认为文件的写入速度不够快,无论如何都无法锁定其他调用的运行。

谁能引导我走向正确的方向?

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

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

相关内容

最新更新