虽然标题提到了文件,但它不一定是文件。任何锁定机制都可以。
情况如下:我有一个用 C 编写的守护进程,以及一个用 php 编写的网页。我想有一种相互锁定的方法,这样在某些情况下,C 守护进程会锁定一个文件,php 检测到这种情况并告诉客户端系统很忙。
有没有一种简单的方法可以做到这一点?
谢谢,
虽然标题提到了文件,但它不一定是文件。任何锁定机制都可以。
情况如下:我有一个用 C 编写的守护进程,以及一个用 php 编写的网页。我想有一种相互锁定的方法,这样在某些情况下,C 守护进程会锁定一个文件,php 检测到这种情况并告诉客户端系统很忙。
有没有一种简单的方法可以做到这一点?
谢谢,
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 中执行以下操作:
if (file_exists('/path/to/file')) {
echo 'System busy';
}
如果您的 PHP 应用程序是数据库驱动的,那么更新该数据库的某个列以指示“系统繁忙”应该很容易。
您的 cronjob 将设置和重置此标志,您的 PHP 应用程序可以读取它的值。
您是否只想让 PHP 检测到守护程序正忙?还是您真的希望他们互相等待?使用独占锁的缺点是 C 守护进程必须等待所有 PHP 实例完成其工作,然后才能获取其锁并继续运行。
如果您只是想检测 C 守护程序是否繁忙(即,仅在一个方向上),那么仅测试是否存在繁忙的令牌文件(或信号量,或共享内存对象 - 取决于平台)可能是一个更好的选择. 然而,创建文件往往比在共享内存中设置一个简单的标志更昂贵。