如果两个人用file_put_contents附加到一个文件中,字符串是否合并


If two people are appending to a file with file_put_contents are the strings merged?

我有以下函数可以写入日志文件:

function writelog($type, $text){
        global $root;
        $userid=$_SESSION['userid'];
        $tdate=date('d/m/Y H:i:s');
        $file = $root.'/logs/log.txt';
        $input=$userid."^".$type."^".$tdate."^".$text."*";  
        file_put_contents($file, $input, FILE_APPEND);
}

每当我的数据库管理员执行某项活动时,此函数用于将条目添加到日志中。

如果两个管理员同时执行一个写入日志文件的操作,会发生什么?附加到文件中的字符串可能会混乱或合并在一起,还是总是按顺序插入?

由于竞争条件,这可能导致文件包含损坏的数据。依赖它只试图附加数据这一事实是不安全的。

相反,您应该确保没有对文件的并发访问。幸运的是,file_put_contents有一个特殊的标志,名为LOCK_EX:

在继续写入时获取文件的独占锁定。

你可以这样使用它:

file_put_contents($file, $input, FILE_APPEND | LOCK_EX);

只需确保您的文件系统支持正确的锁定机制。例如,我的托管公司在某个时候遇到了麻烦,因为他们使用NFS,而NFS缺乏对独占锁的支持。