PHP命名为信号量?

时间:2010-09-27 20:54:48

标签: php posix

我一直在寻找,但我似乎无法找到任何针对PHP的POSIX命名信号量的实现。我唯一看到的是SysV信号量。

(2个问题)

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

有未来的PHP发布计划吗?

2 个答案:

答案 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()它将成功。