我有以下函数可以写入日志文件:
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缺乏对独占锁的支持。