2012-04-24 32 views
2

好写同一个文件,我知道有许多人在这个网站关于这个问题类似的问题,但没有这个问题,而且提供的答案是不正是我需要的。在同样的时间

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

  1. 2,3,10 ..... FWRITE在附加模式requestes来到同一PHP文件 “contact_form_messages_container.php” 在同一时间?

  2. 2,3,10 ..... fwrite in“w”mode requestes to same php file which hold the simpley nubmer of specific page visits,again at same time?

我知道flock()函数,但它可能发生两个或多个flock()请求同时发生......有谁知道这个问题的解决方案吗?我唯一想到的就是在一段时间内使用脚本,直到目标文件变得平衡,但我不知道它是否有效,在哪里以及如何执行? 有没有人有这个问题的实际expirience? 在此先感谢!

+0

不是一个真正的答案,但...使用数据库。真。 :P – 2012-04-24 06:43:29

回答

0

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

除非你的文件在NFS,我很怀疑,你永远不会碰到一个情况,即两个相互冲突的锁将被同时给予。


下面说明使用flock()的一个基本的例子:用LOCK_EXLOCK_SH一起使用LOCK_NB标志将防止被暂停的过程

// 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); 

;如果调用返回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循环,而文件被锁定。只要您的应用程序不依赖于按时间顺序进行文件系统调用,它应该可以工作。

但是,如果您的应用程序依赖于写入操作以便按顺序发生,则竞争条件将会打开。