【问题标题】:Writing to same file at the very same time同时写入同一个文件
【发布时间】:2012-05-04 19:06:42
【问题描述】:

好的,我知道这个网站上有关于这个问题的类似问题,但是这些问题和提供的答案都不是我所需要的。

我正在构建基于平面文件的 CMS。 如果,例如:

  1. 2、3、10..... fwrite 附加模式请求同时到达同一个 php 文件“contact_form_messages_container.php”?

  2. 2, 3, 10..... fwrite in "w" 模式请求到达同一个 php 文件,该文件包含特定页面访问的简单数字,再次同时?

    李>

我知道flock() 函数,但它可能会发生两个或多个flock() 请求同时出现...有谁知道这个问题的解决方案?我唯一想到的是使用 while 循环在一段时间内使用睡眠()-ing 脚本,直到目标文件变得可用,但我不知道它是否有效,在哪里以及如何执行此操作? 有没有人有这个问题的实际经验? 提前致谢!

【问题讨论】:

  • 不是一个真正的答案,但是...使用数据库。真的。 :P

标签: php filesystems fopen flock


【解决方案1】:

分叉写入操作并将其放入一个带有睡眠的while循环,而文件被锁定。只要您的应用程序不依赖于按时间顺序进行文件系统调用,它就应该可以工作。

但是,如果您的应用程序依赖于按顺序发生的写入操作,这对于竞争条件是开放的。

【讨论】:

    【解决方案2】:

    flock() 函数旨在处理多个并发读写器进行文件操作;默认情况下,flock() 可能会暂停进程,直到可以获得兼容的锁(即共享或独占)。一旦获得,稍后可以释放锁以允许其他进程对该文件进行操作;当文件关闭或进程结束时,锁会被隐式释放。

    除非您的文件在 NFS 上,否则我非常怀疑您是否会遇到同时给出两个冲突锁的情况。


    下面是一个使用flock()的基本例子:

    // open the file (take care to not use "w" mode)
    $f = fopen('file.txt', 'r+');
    // obtain an exlusive lock (may suspend the process)
    if (flock($f, LOCK_EX)) {
        // this process now holds the only exclusive lock
    
        // make changes to the file
    
        // release the lock
        flock($f, LOCK_UN);
    }
    // don't perform any write operation on $f here
    fclose($f);
    

    LOCK_NB 标志与LOCK_EXLOCK_SH 一起使用将防止进程被挂起;如果调用返回false,则可以传递第三个参数以确定进程是否会被挂起(Windows 不支持)。

    if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) {
        if ($wouldblock) {
            // the lock could not be obtained without suspending the process
        } else {
            // the lock could not be obtained due to an error
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多