3

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

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

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

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

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

4

2 回答 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_EX或一起使用LOCK_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
    }
}
于 2012-04-24T08:49:57.190 回答
0

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

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

于 2012-04-24T06:57:50.773 回答