PHP命名信号量?

PHP命名信号量?,php,posix,Php,Posix,我一直在四处寻找,但似乎找不到任何用于PHP的POSIX命名信号量的实现。我唯一看到的是SysV信号量 (2个问题) 目前有没有办法从PHP访问命名信号量 PHP的未来版本有什么计划吗?这是我的“命名”信号量实现,但我不确定您是否在寻找一个简单的字符串到int转换器 /** * Generate a semaphore integer from a string/key * * @param string $identifier * @return int */ function se

我一直在四处寻找,但似乎找不到任何用于PHP的POSIX命名信号量的实现。我唯一看到的是SysV信号量

(2个问题)

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

PHP的未来版本有什么计划吗?

这是我的“命名”信号量实现,但我不确定您是否在寻找一个简单的字符串到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;
}
/**
*从字符串/键生成信号量整数
*
*@param字符串$identifier
*@return int
*/
函数sem_键($identifier){
$md5=md5($identifier);
$key=0;
对于($i=0;$i<32;$i++){
$key+=ord($md5{$i})*$i;
}
返回$key;
}

我想简短的答案应该是,从我的“研究”中,我发现目前PHP中没有一个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\u EX
,有时我只需要读取该文件


注意:
flock()
作为一种建议性的文件锁定机制,如果任何其他程序试图在不调用
flock()
的情况下修改文件,则会成功。

您为什么需要访问信号量?PHP不支持线程…@Byron:您可以从不同的进程访问相同的命名信号量,而不仅仅是线程。我实际上需要锁定一个PHP和perl脚本都要写入的文件。PHP和perl脚本可以同时运行多个实例。我也看到了flock()函数,但我认为它不会起作用。有趣的解决方法。我实际上使用了flock()函数,这正是我所需要的,但我很感谢你的回答。我是StackOverflow的新手(您可能已经注意到)。有没有办法把这个问题贴上“不再需要答案”的标签?或者我应该把你的答案标记为“接受答案”?你应该用你使用的解决方案回答你自己的问题。并将你自己的答案标记为“接受答案”,碰撞的可能性有多大?系统上运行的其他进程也可能与之冲突?@mpapec据我所知,所有进程都共享system V信号量,因此总是有冲突的可能。只要在信号量锁中不使用其他信号量,这就不一定是问题,获取锁只需要更长的时间。因此,$md5的第一个字符被忽略,这可能导致冲突。考虑乘以$i+1代替:($i=0;$i<32;$i++){$KEK+= ORD($MD5{$i})*($i+1);}