PHP日志代码不稳定,有时只写


PHP Logging code unstable, writes only sometimes

我在一个类上创建了一个logger方法,基本的日志代码是这样的:

    // maximum length of file (in characters / bytes)
    $maxlength = 40000;
    $filename = "logs/$this->account_id.log";
    // add to the first line
    $fileContent = file_exists($filename) ? file_get_contents($filename, NULL, NULL, NULL, $maxlength) : "";
    file_put_contents($filename, '['.date('d-m-Y- H:i:s').'] - '.$message.PHP_EOL. $fileContent);

它确保首先显示最新的日志条目。所有工作正常,除了一些消息被记录,然后在一段时间后恢复到3天前。

文件有写权限,你知道会发生什么吗?

很可能是并发性问题。每个用户都有一个单独的日志文件,但是用户可能在短时间内发送多个请求,从而达到同时发出多个日志的不希望的结果。您需要在数据库或独立服务中形成某种队列,该队列将接收消息,并且将是唯一负责写入日志文件的东西。

示例解决方案:

  • 在需要新的日志时创建一个RDBMS表user_log(account_id, message, timestamp)。这实际上会让系统知道您打算存储一些日志
  • 您创建一个cron作业,它将定期查看需要更改的用户日志文件并更改它们