2011-04-11 121 views
0

我在php中使用fwrite记录logs.txt中的一些错误。fwrite多次保存相同的消息

问题是,当我打开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 
+3

如何向我们展示您的代码? – PeeHaa 2011-04-11 19:02:53

+4

问题的标题是有趣的,给定的问题 – MJB 2011-04-11 19:13:05

+0

“代码不在任何自我调用函数”是什么意思?如果你不调用它,它怎么被调用? – netcoder 2011-04-11 19:53:24

回答

0

我fwrite的代码没有任何循环中,所以它肯定是只执行一次。使用第三方记录器类也是如此。

如果别人的代码显示相同的行为,那么只有一个可能的根本原因:该代码被称为三次。

它可能是您的代码到get out a debuggeradd a breakpoint的时间,然后遍历第一次调用后发生的所有事情。这无疑将会引导你接下来的电话来源。

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

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

我使用了netbeans debbuger。事实证明,脚本(准确的index.php)迭代3次。我真的不明白为什么。我使用自己的mvc框架和mod_rewrite将每个请求都定位到index.php。我现在明白调试器是解决我的问题的显而易见的方式,但我是初学者,而且是我第一次使用它。 – Nikos 2011-04-12 14:18:35