file_put_contents锁的问题

记一次线上生产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);

这样的确不会出现丢日志的问题

但问题来了,在并发下,导致接口响应速度极慢

所以又删了

慎用

相关推荐
云和数据.ChenGuang6 小时前
PHP-FPM返回的File not found.”的本质
开发语言·php·运维工程师·运维技术
惜分飞9 小时前
sql server 事务日志备份异常恢复案例---惜分飞
前端·数据库·php
qqssss121dfd11 小时前
计算机网络(第8版,谢希仁)第三章习题解答
网络·计算机网络·php
闲人编程12 小时前
中间件开发与生命周期管理
缓存·中间件·生命周期·日志·扩展·codecapsule
苏琢玉13 小时前
用 PHP 解析 Protobuf 的坑与解法
php·protobuf
真正的醒悟14 小时前
图解网络35
开发语言·网络·php
郑州光合科技余经理16 小时前
技术视角:海外版一站式同城生活服务平台源码解析
java·开发语言·uni-app·php·排序算法·objective-c·生活
郑州光合科技余经理16 小时前
海外版生活服务系统源码 | 外卖+跑腿一站式平台技术解析
java·开发语言·javascript·git·spring cloud·php·生活
catchadmin18 小时前
告别 Shell 脚本:用 Laravel Envoy 实现干净可复用的部署
php·laravel
云和数据.ChenGuang20 小时前
Zabbix 6 与 PHP 5 版本**完全不兼容
运维·开发语言·php·zabbix·运维工程师