【问题标题】:PHP LOCK_EX+LOCK_NB on a file文件上的 PHP LOCK_EX+LOCK_NB
【发布时间】:2020-01-21 10:12:26
【问题描述】:

我们可以在文件上使用 LOCK_EX+LOCK_NB 吗?这在语法上正确吗? 如果是,它与 LOCK_EX|LOCK_NB 有何不同

$fh = fopen('guestbook.txt','a') or die($php_errormsg); 
flock($fh,LOCK_EX+LOCK_NB) or die($php_errormsg);

谢谢

【问题讨论】:

  • 如果您使用多个标志,您应该使用| 组合它们,而不是+。像这样:flock($fh, LOCK_EX | LOCK_NB)
  • @MagnusEriksson 谢谢。

标签: php locking flock


【解决方案1】:

LOCK_EXLOCK_NB 等标志将被定义为具有 2 的幂的值。它们旨在通过按位或(| 运算符)组合以生成位字段。

以下是实际使用的数值:

LOCK_SH = 1;
LOCK_EX = 2;
LOCK_NB = 4;
LOCK_UN = 8;

现在在某些情况下,加法恰好给出与按位或相同的结果(例如在对两个单独的标志进行操作时,或更一般地,对不共享任何标志的两个位字段进行操作)。但是,这是不可取的,因为如果在两个操作数中设置了相同的标志,则会导致进位,从而产生意想不到的后果。

考虑这个例子:

$flags = LOCK_EX | LOCK_NB;
flock($fh, $flags | LOCK_NB);  // ensure that call is non-blocking

在这种形式中,LOCK_NB 位已经在$flags 中设置并不重要;传递给flock 的第二个参数仍将等于LOCK_EX | LOCK_NB(数字为6)。如果改为使用+,则不是预期的10(即LOCK_EX | LOCK_UN)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2011-07-28
    • 2015-10-23
    • 1970-01-01
    • 2011-07-27
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多