PHP flock

一共有两种锁,6中组合:

  • 共享锁 LOCK_SH
  • 独占锁 LOCK_EX
  • 外加 [无锁] 状态

LOCK_SH + 无锁

A 进程使用 LOCK_SH ,可以读,可以写。
B 进程无锁,可以读,无法写。(但实测,直接 fwrite 失败,先 fread 一下,然后 fwrite 就可以成功)

LOCK_EX + 无锁

A 进程使用 LOCK_EX,可以读,可以写。
B 进程无锁,无法读(fread 返回空),无法写(fwrite 失败)

LOCK_SH + LOCK_EX

LOCK_EX + LOCK_SH

LOCK_EX + LOCK_EX

  1. 使用独占锁,在未解锁前,其他进程想要加锁会被阻塞直至解锁为止
  2. 其他进程加锁,新进程想要使用独占锁,也会被阻塞直到其他进程解锁(哪怕其他进程使用的是共享锁)

例如:
A 进程使用 LOCK_SH ,可以读,可以写。
B 进程使用 LOCK_EX ,会被阻塞,在 A 继承解锁前程序阻塞等待

A 进程使用 LOCK_EX ,可以读,可以写。
B 进程使用 LOCK_SH,会被阻塞,在 A 继承解锁前程序阻塞等待

LOCK_SH + LOCK_SH

与 LOCK_SH + 无锁 表现一致
A 进程 LOCK_SH 、B 进程 LOCK_SH 不会被阻塞,可以读,无法写(通用的,先读后写就可以成功)
不同的是,若有 C 进程想使用 LOCK_EX , 必须等待 A B 进程都解锁

LOCK_UN

解锁,没啥好说的

LOCK_NB

用于组合使用,不阻塞,比如
flock($fp, LOCK_EX | LOCK_NB)
由于该特性 Unix Only,尽量不使用,避免程序在跨平台时出现问题

你可能感兴趣的:(PHP flock)