记一次线上生产file_put_contents锁的问题
php项目,很多地方加了日志记录,方法为
function logstr($name='log',$str="",$type="Ymd"){
$file = date("$type").'_'.$name.'.log';
$add = __DIR__.'/../runtime/cuslog/'.date("Ym").'/';
if(!is_dir($add)){
mkdir(iconv("UTF-8", "GBK", $add),0777,true);
}
$file = $add.$file;
$content=[
'name'=>$name,
'premsg'=>'',
'time'=> date('Y-m-d H:i:s'),
'content'=>$str
];
file_put_contents($file, json_encode($content,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES).PHP_EOL,FILE_APPEND);
}
忽然有天查日志,发现日志有丢失问题,在并发情况下,有些日志没有没记录下来
所以加了下锁 LOCK_EX
变为
file_put_contents($file, json_encode($content,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES).PHP_EOL,FILE_APPEND|LOCK_EX);
这样的确不会出现丢日志的问题
但问题来了,在并发下,导致接口响应速度极慢
所以又删了
慎用