2010-09-27 39 views
4

我一直在环顾四周,但我似乎无法找到任何POSIX命名信号的PHP实现的实现。我唯一看到的是SysV信号量。PHP命名为信号量?

(2题)

有没有办法从PHP目前访问命名信号?

有没有计划将来的PHP版本?

+0

为什么你需要访问信号灯? PHP不支持线程... – 2010-09-27 20:56:38

+0

@Byron:你可以从不同的进程访问同一个命名的信号量,而不仅仅是线程。 – VolkerK 2010-09-27 21:17:17

+0

我实际上需要锁定一个PHP和perl脚本写入的文件。并且可以有几个运行PHP和perl脚本的实例。我也看到了flock()函数,但我认为这不会诀窍。 – Ixai 2010-09-27 22:00:47

回答

2

我想简短的答案是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()它会成功。

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; 
} 
+0

有趣的解决方法。我实际上玩过flock()函数,这正是我所需要的,但我很欣赏你的答案。 我是新来的StackOverflow(你可能已经注意到了)。有什么方法可以将此问题标记为“不再需要回答”?或者,我是否应该将您的答案标记为“已接受的答案”? – Ixai 2010-09-29 22:48:16

+0

你应该用你使用的解决方案回答你自己的问题。并将自己的答案标记为“已接受的答案” – 2010-09-30 07:40:09

+0

碰撞的可能性有多大?系统上还有其他进程可能会与它冲突? – 2013-09-17 13:21:59