【问题标题】:fwrite saves same message multiple timesfwrite 多次保存同一条消息
【发布时间】:2023-08-23 12:24:01
【问题描述】:

我在 php 中使用 fwrite 在 logs.txt 中记录一些错误。

问题是,当我打开 db_errors.txt 时,我看到消息保存了多次,而不是只保存一次。

我的 fwrite 代码不在任何循环中,所以它肯定只执行一次。使用第三方记录器类也有同样的想法。

if (!$result = mysqli_query($link, $query)){
    $today = getdate();
    $handle = fopen("logs/db_errors.txt", "a");
    fwrite($handle, $today['mday'].'/'.$today['mon'].'/'.$today['year']." | ".mysqli_errno($link)." : ".mysqli_error($link)." | ".$query." \n");
    fclose($handle);
}

这在 db_errors.txt 中写入 3 行,输出相同。

11/4/2011 | 1054 : Unknown column 'uids' in 'field list' | SELECT uids FROM users WHERE user_id=6 LIMIT 1 
11/4/2011 | 1054 : Unknown column 'uids' in 'field list' | SELECT uids FROM users WHERE user_id=6 LIMIT 1 
11/4/2011 | 1054 : Unknown column 'uids' in 'field list' | SELECT uids FROM users WHERE user_id=6 LIMIT 1 

【问题讨论】:

  • 向我们展示你的代码怎么样?
  • 问题的标题有点好笑,考虑到问题
  • “代码不在 [...] 任何自调用函数中”是什么意思?不调用怎么调用呢?
  • 您使用a 打开文件。您确定其他条目不是来自较旧的执行吗? @netcoder:有点奇怪的描述,但我敢打赌他的意思是“递归”:)
  • 我认为这是正常的,因为mysqli_error可能会回显多个错误消息,您可以发布db_errors.txt的内容。

标签: php logging fwrite


【解决方案1】:

我的 fwrite 代码不在任何循环中,所以它肯定只执行一次。使用第三方记录器类也有同样的想法。

如果其他人的代码表现出相同的行为,那么您只有一个可能的根本原因:代码被调用了 3 次。

可能是时候将get out a debuggeradd a breakpoint 加入您的代码,然后逐步完成第一次调用后发生的所有事情。这无疑会引导您找到后来调用的来源。

您可能还想考虑在日志中添加完整的时间戳和微时间,而不是 getdate。通过证明确实存在三个调用,这可能会使故障排除更加有效。

$time_plus_micro = date('Y-m-d H:i:s') . ' ' . microtime(true)
fwrite($handle, $time_plus_micro . " | ...";

【讨论】:

  • 我使用了 netbeans 调试器。事实证明,脚本(准确地说是 index.php)迭代了 3 次。我真的不明白为什么。我使用自己的 mvc 框架和 mod_rewrite 将每个请求定位到 index.php。我现在明白调试器是解决我的问题的明显方法,但我是初学者,这是我第一次使用它。
最近更新 更多