【问题标题】:PHP named semaphores?PHP命名信号量?
【发布时间】:2010-09-27 20:54:48
【问题描述】:

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

(2 个问题)

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

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

【问题讨论】:

  • 为什么需要访问信号量? PHP 不支持线程...
  • @Byron:你可以从不同的进程访问同一个命名的信号量,而不仅仅是线程。
  • 我实际上需要锁定一个 PHP 和 perl 脚本都写入的文件。并且可以同时运行多个 PHP 和 perl 脚本实例。我也看到了 flock() 函数,但我认为它不会成功。

标签: php posix


【解决方案1】:

这是我的“命名”信号量实现,但我不确定您是否正在寻找一个简单的字符串到 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 的新手(您可能已经注意到了)。有没有办法将这个问题标记为“不再需要答案”?还是我应该将您的答案标记为“已接受的答案”?
  • 您应该使用您使用的解决方案来回答您自己的问题。并将您自己的答案标记为“已接受的答案”
  • 发生碰撞的可能性有多大?系统上还有其他正在运行的进程可能与它发生冲突?
  • @mpapec 据我了解,System V 信号量在所有进程之间共享,因此总是有可能发生冲突。只要您不在信号量锁中使用其他信号量,这不是问题,获取锁的时间会更长。
  • 第一步,当$i == 0时,$key加零。因此,$md5 的第一个字符被忽略,这可能导致冲突。考虑乘以 $i + 1: for ($i = 0; $i
【解决方案2】:

我想简短的回答是 NO,根据我的“研究”,我发现 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_EX,有时我只需要读取文件。

注意:flock() 用作建议文件锁定机制,如果任何其他程序尝试修改文件而不调用 flock(),它将成功。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 2011-10-23
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多