我有一个从API调用的脚本。我遇到的问题是脚本在很短的时间内被调用了太多次,有时是1/1000秒。在我的脚本中,我有sql查询,根据某人安排播放列表的时间进行一些删除和更新。
流程如下:
似乎很简单,但是,如果创建了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仍然存在问题。意思是,我认为文件写入速度不够快,无论是否锁定其他调用还没有。
有人能引导我朝正确的方向前进吗?
答案 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');
}