我有一个从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');
}