代码之家  ›  专栏  ›  技术社区  ›  phuang07

使用flock()锁定流只能确保在什么情况下工作?

  •  2
  • phuang07  · 技术社区  · 15 年前

    这是一个来自php zend考试的问题,

    使用flock()锁定流只能确保在什么情况下工作?

    • 在Linux环境中运行时,本地文件系统
    • 访问本地文件系统的流时
    • 在Windows环境中运行并访问共享时
    • 访问双向流时
    • 访问只读流时
    2 回复  |  直到 15 年前
        1
  •  5
  •   Artefacto    15 年前

    溪流有 this set of operations 艾斯 write , read , close , flush (强制要求,即使他们没有行动)和 seek , cast , stat , set_option (可选)。当您请求文件锁定时, 设置选项 操作是 called .

    从这里,您可以看到双向或只读与此无关。可以实现任意包装,使写入和读取具有某种效果,但不能实现 设置选项 ,因为它是可选的。同样,也可以实现无操作 操作,但在我的 设置选项 实施。在Linux环境中运行也是不相关的,因为重要的是流支持什么。

    ( 注释 :我不确定“在Linux环境中运行本地文件系统”是什么意思。我承认这意味着“在Linux环境中从本地文件系统运行PHP”,而不是“在Linux环境中从AFS文件系统运行PHP”。它的意思是“在Linux环境中访问支持本地文件系统的流”,考虑到下面描述的手动警告,这可能是正确的答案。

    剩下的问题涉及到stdio流。现在,当检查流是否支持使用 stream_supports_lock ,php实际上不尝试群,它通过 设置选项 操作查询“此流是否支持文件锁定”的特殊值?stdio流操作 always responds it does 所以剩下的两个答案似乎都是正确的。

    然而,事实是 设置选项 操作声明它支持文件锁定不会使其成为真的。当你真的想拿到锁的时候, it may fail . 那么,它什么时候能保证工作呢?当然不是Windows共享,因为这些几乎可以得到任何支持。我们只剩下“在本地文件系统上”。所以答案是,通过消除

    访问本地文件系统的流时

    然而,请注意(公认过时的) warning in the manual :

    Flock()在fat及其派生文件系统等过时的文件系统上不受支持,因此在这种[sic]环境下总是返回false(对于Windows98用户尤其如此)。

        2
  •  1
  •   Charles    15 年前

    哦,好问题。

    Checking if a stream supports locking 仅在5.3中添加,但 streamWrapper example class has a stream_lock method 这似乎“总是”存在。 流锁 建议它也可以工作 streams that can be blocked .

    我不指望你能聚集一个套接字,所以你的答案似乎是2:当流是(本地)文件时,你可以安全地知道聚集一个流是有效的。

    (Flock如何操作远程文件(NFS、CIFS)取决于提供这些远程文件的服务。例如,各种NFS守护进程的一些旧版本根本不支持flock。)