PHP - file_put_contents多次写入内容

时间:2014-09-26 11:04:25

标签: php

我的记录器功能非常简单:

<?php
class Logger {
    public function __construct($logFile) {
        $this->logFile = $logFile;
    }

    public function log($message) {
        $message = date('c') . $message;
        file_put_contents($this->logFile, $message, FILE_APPEND | LOCK_EX);
        echo "it ran ";
    }
}

像这样调用

$logger = new Logger('log.txt');
$logger->log("message");
echo "called the method";

使消息准确写入文件3次,而不是1次。

代码在任何循环之外,由echo语句确认,只能打印一次。

另外,如果我只是在我调用日志方法的地方运行file_put_contents()函数,它可以正常工作并只写一次内容。所以它可能与我的班级有关,但不知道是什么。

编辑:@Tommy:这是日志文件内容: 2014-09-26T07:24:51-04:00message2014-09-26T07:24:54-04:00message2014-09-26T07:24:54-04:00message

编辑2:我在调用方法后尝试使用die()函数,然后它只写了一次消息。所以我一直在通过代码移动die(),然后在这一行之后开始写3次消息:

if (isset($_POST['create_account'])) {
    die;

由于它下面有一个骰子,所以在其他代码中它应该不重要,对吧?

不知道它是否可能是某种php bug,这是非常危险的。如果我将die()放在这一行之上,它将正常工作并只写一次消息。

2 个答案:

答案 0 :(得分:1)

您的代码很可能会在某处重定向或重新加载。这会导致新请求启动,这会擦除原始回显,但不会删除写入文件的回显。结果它看起来像曾经回响一次并且写了三次。但实际上,它也是三次回声,其他副本已被删除。

如果要查看正在发生的事情,请将堆栈跟踪的一部分与消息一起打印到日志文件中。您可以准确地看到消息的创建行以及在哪个函数调用期间。

答案 1 :(得分:0)

根据我的经验,主要问题是 index.php 被调用了两次。因此,要修复:

  • 更改文件名
  • 修复 index.php,使 favicon.ico 丢失!