在C和PHP之间锁定文件

时间:2011-01-25 16:41:14

标签: php c locking mutual-exclusion

虽然标题提到了文件,但它不一定是文件。任何锁定机制都可以。

情况如下:我有一个用C语言编写的守护程序进程,以及一个用PHP编写的网页。我希望有一种相互锁定的方式,以便在某些情况下,C守护程序将锁定文件并且php检测到该情况并告诉客户端系统正忙。

有没有一种简单的方法可以做到这一点?

谢谢,

4 个答案:

答案 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

请参阅PHP的flock()文档和C的one

答案 1 :(得分:2)

你可以让你的守护进程在繁忙时创建一个文件,然后在没有时删除它,然后在PHP中执行以下操作:

if (file_exists('/path/to/file')) {
    echo 'System busy';
}

答案 2 :(得分:1)

如果您的PHP应用程序是数据库驱动的,则应该很容易更新该数据库的某一列以指示“系统正忙”。

你的cronjob会设置并重置这个标志,你的PHP应用程序可以读取它的值。

答案 3 :(得分:1)

您是否只希望PHP检测到守护程序正忙?或者你真的希望他们互相等待吗?使用独占锁将有一个缺点,即C守护进程必须等待任何和所有PHP实例完成其工作才能获取其锁定并继续。

如果您只想检测C守护程序是否繁忙(即,仅在一个方向上),则只测试繁忙令牌文件(或信号量或共享内存对象 - 依赖于平台)的存在可能是一个更好的选择。然而,创建文件往往比在共享内存中设置简单标志更昂贵。