我的记录器功能非常简单:
<?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()放在这一行之上,它将正常工作并只写一次消息。
答案 0 :(得分:1)
您的代码很可能会在某处重定向或重新加载。这会导致新请求启动,这会擦除原始回显,但不会删除写入文件的回显。结果它看起来像曾经回响一次并且写了三次。但实际上,它也是三次回声,其他副本已被删除。
如果要查看正在发生的事情,请将堆栈跟踪的一部分与消息一起打印到日志文件中。您可以准确地看到消息的创建行以及在哪个函数调用期间。
答案 1 :(得分:0)
根据我的经验,主要问题是 index.php 被调用了两次。因此,要修复: