我一直在寻找,但我似乎无法找到任何针对PHP的POSIX命名信号量的实现。我唯一看到的是SysV信号量。
(2个问题)
目前有没有办法从PHP访问命名信号量?
有未来的PHP发布计划吗?
答案 0 :(得分:3)
这是我的“命名”信号量实现,但我不确定你是否正在寻找一个简单的字符串到int转换器。
/**
* Generate a semaphore integer from a string/key
*
* @param string $identifier
* @return int
*/
function sem_key($identifier) {
$md5 = md5($identifier);
$key = 0;
for ($i = 0; $i < 32; $i++) {
$key += ord($md5{$i}) * $i;
}
return $key;
}
答案 1 :(得分:2)
我想简短的回答是 NO ,从我的“研究”中我发现目前没有一个名为semaphores的POSIX实现。
Bob Fanger发布了一个有趣的解决方法,将字符串转换为SysV信号量键,缺点是您必须在每个需要信号量的代码中实现相同的算法。我最终做的是在锁定文件上使用flock()
。
<强> PHP 强>
# open an exclusive lock
$lock = fopen('/path/to/file.lock', 'w');
flock($lock, LOCK_EX);
# edit a file
$f = fopen ('/path/to/file.txt', 'a');
fwrite($f, "append through PHP\n");
fclose($f);
# unlock
flock($lock, LOCK_UN);
fclose($lock);
<强> PERL 强>
use Fcntl qw(:flock);
# open an exclusive lock
open LOCK, '>/path/to/file.lock';
flock LOCK, LOCK_EX;
# edit a file
open FILE, '>>/path/to/file.txt';
print FILE "append through PERL\n";
close FILE;
# unlock
flock LOCK, LOCK_UN;
close LOCK;
我知道额外的锁定文件可能看起来有点过分,但你只能在写入模式下使用LOCK_EX
,有时我只需要读取文件。
注意: flock()
作为咨询文件锁定机制,如果任何其他程序尝试修改文件而不调用flock()
它将成功。