PHP flock

作者: 马六甲的笔记 | 来源:发表于2021-01-22 21:42 被阅读0次

    一共有两种锁,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

          本文链接:https://www.haomeiwen.com/subject/apvezktx.html