同时写入同一文件问题

3

好的,我知道这个网站上有类似的问题,但是没有一个问题和提供的答案完全符合我的需求。

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

  1. 2、3、10…… 在相同时间内请求以追加模式 fwrite 到同一个php文件“contact_form_messages_container.php”中怎么办?

  2. 2、3、10…… 在同一时间内请求以“w”模式 fwrite 到同一个保存简单页面访问量的php文件中怎么办?

我知道 flock() 函数,但可能会同时出现两个或更多 flock() 请求... 有人知道这个问题的解决方案吗?我脑海中唯一想到的是使用 while 循环 usleep() 脚本一段时间,直到目标文件变为可用状态,但我不知道它是否有效,在哪里以及如何执行它? 有人有这个问题的实践经验吗? 先谢谢了!


不是真正的答案,但是……使用数据库。真的。:P - Jani Hartikainen
2个回答

1

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
    }
}

0

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

然而,这样做会打开竞态条件,如果您的应用程序依赖于写入操作按顺序发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接