我一直在环顾四周,但我似乎无法找到任何POSIX命名信号的PHP实现的实现。我唯一看到的是SysV信号量。PHP命名为信号量?
(2题)
有没有办法从PHP目前访问命名信号?
有没有计划将来的PHP版本?
我一直在环顾四周,但我似乎无法找到任何POSIX命名信号的PHP实现的实现。我唯一看到的是SysV信号量。PHP命名为信号量?
(2题)
有没有办法从PHP目前访问命名信号?
有没有计划将来的PHP版本?
我想简短的答案是NO ,从我的“研究”,我发现没有一个POSIX命名信号实现目前在PHP。
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()
它会成功。
这里是我的“命名”信号量实现,但我不知道如果你正在寻找一个简单的字符串到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;
}
有趣的解决方法。我实际上玩过flock()函数,这正是我所需要的,但我很欣赏你的答案。 我是新来的StackOverflow(你可能已经注意到了)。有什么方法可以将此问题标记为“不再需要回答”?或者,我是否应该将您的答案标记为“已接受的答案”? – Ixai 2010-09-29 22:48:16
你应该用你使用的解决方案回答你自己的问题。并将自己的答案标记为“已接受的答案” – 2010-09-30 07:40:09
碰撞的可能性有多大?系统上还有其他进程可能会与它冲突? – 2013-09-17 13:21:59
为什么你需要访问信号灯? PHP不支持线程... – 2010-09-27 20:56:38
@Byron:你可以从不同的进程访问同一个命名的信号量,而不仅仅是线程。 – VolkerK 2010-09-27 21:17:17
我实际上需要锁定一个PHP和perl脚本写入的文件。并且可以有几个运行PHP和perl脚本的实例。我也看到了flock()函数,但我认为这不会诀窍。 – Ixai 2010-09-27 22:00:47