虽然标题提到了文件,但它不一定是文件。任何锁定机制都可以。
情况如下:我有一个用C语言编写的守护程序进程,以及一个用PHP编写的网页。我希望有一种相互锁定的方式,以便在某些情况下,C守护程序将锁定文件并且php检测到该情况并告诉客户端系统正忙。
有没有一种简单的方法可以做到这一点?
谢谢,
答案 0 :(得分:3)
flock
做得恰到好处。
在PHP脚本中,使用非阻止锁:
$fd = fopen('/var/run/lock.file', 'r+');
if (!flock($fd, LOCK_SH | LOCK_NB, $wouldblock) && $wouldblock) {
// buzy
}
LOCK_NB标志使此调用无阻塞。如果文件是独占锁定的,它将立即返回。允许多个页面同时锁定文件。
您可以使用
释放锁定flock($fd, LOCK_UN);
在您的C守护程序中,使用阻止和独占锁:
flock(fd, LOCK_EX); // This will wait until no page has locked the file
答案 1 :(得分:2)
你可以让你的守护进程在繁忙时创建一个文件,然后在没有时删除它,然后在PHP中执行以下操作:
if (file_exists('/path/to/file')) {
echo 'System busy';
}
答案 2 :(得分:1)
如果您的PHP应用程序是数据库驱动的,则应该很容易更新该数据库的某一列以指示“系统正忙”。
你的cronjob会设置并重置这个标志,你的PHP应用程序可以读取它的值。
答案 3 :(得分:1)
您是否只希望PHP检测到守护程序正忙?或者你真的希望他们互相等待吗?使用独占锁将有一个缺点,即C守护进程必须等待任何和所有PHP实例完成其工作才能获取其锁定并继续。
如果您只想检测C守护程序是否繁忙(即,仅在一个方向上),则只测试繁忙令牌文件(或信号量或共享内存对象 - 依赖于平台)的存在可能是一个更好的选择。然而,创建文件往往比在共享内存中设置简单标志更昂贵。