2015-10-15 38 views
1

我正在使用PHP在我的服务器上开发一些apis。我有一个脚本,用于查询数据库,并且在查询结果的某些逻辑之后,如果需要,它会更新数据库中的另一个表。每当有新的特定api请求时,都会执行此脚本。跨会话执行php脚本,请求和范围之外

我的目标是在脚本开始时设置一个布尔值== true,并且脚本结束时将其重置为false。因此,所有新的请求都可以读取布尔值并仅在布尔值== false时启动脚本。否则,脚本将不会从这个请求中执行,这对我的目的非常有用。

我知道,在PHP中的静态变量保持他们只在当前范围和会话变量值只能在同一会话持久性,但应该有办法做到这一点。

我的第一个解决方案是写在服务器上(或数据库)txt文件更新布尔值当脚本开始/结束和启动脚本之前阅读。我没有测试过,但如果有很多请求,txt文件(或数据库行)可以同时更多的请求异步更新,因为当一个请求设置为true时,布尔值,另一个请求可能已经读取该值并再次运行脚本。

的也许不是布尔我会保存日期或时间戳,所以用一些逻辑的脚本只有

(last execution timestamp + 5 minutes) < now() 

是否有实现这个解决方案被执行? 感谢

+0

在计算机科学方面......“读一个表,并更新另一个”是关键的部分。你想独家访问它。但是,如果进程(会话)无法访问,则不希望它们被阻止。这个问题是一个竞争条件。 PHP有这个问题的解决方法。见鸡群功能。您想要使用选项LOCK_EX | LOCK_NB进行非阻塞锁定。 – kainaw

+1

直接在MySQL表上写入锁定可能会更好(假设您使用的是MySQL)。请参阅:https://dev.mysql.com/doc/refman/5.7/en/lock-tables.html – Mike

回答

3

使用羊群。在独占/非阻塞状态下,当且仅当您的进程具有独占锁时,才可以执行代码。

$lock = fopen('/var/tmp/your.lock', 'a'); 
if (flock($lock, LOCK_EX|LOCK_NB)) { 
    // Do your read/update stuff 
    flock($lock, LOCK_UN); // Release the lock 
} 

这样可以避免竞争条件,让您独占访问读取/写入所需的数据。但是,涉及的每个脚本都必须使用相同的锁定文件。

编辑:基于下面的评论,我确信,说明你需要解除锁定。

+0

我是否应该用flock($ lock,LOCK_UN)或此实现版本文件本身释放锁定? – lubilis

+0

是的!如果您不释放锁定,则没有其他人可以使用它。现在编辑答案... – kainaw