fwrite сохраняет одно и то же сообщение несколько раз

#php #logging #fwrite

#php #ведение журнала #fwrite

Вопрос:

Я использую fwrite в php для регистрации некоторых ошибок в 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);
}
  

это записывается в 3 строки внутри db_errors.txt с одинаковым выводом.

 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 
  

Комментарии:

1. Как насчет того, чтобы показать нам свой код?

2. название вопроса довольно забавное, учитывая вопрос

3. Что означает «код не находится внутри […] какой-либо самостоятельно вызываемой функции»? Как это может быть вызвано, если вы его не вызываете?

4. Вы открываете файл с помощью a . Вы уверены, что другие записи не относятся к более старому исполнению? @netcoder: Немного любопытное описание, но держу пари, он имеет в виду «рекурсию» 🙂

5. Я думаю, это нормально, поскольку mysqli_error может отображать несколько сообщений об ошибках, не могли бы вы опубликовать содержимое db_errors.txt.

Ответ №1:

Мой код fwrite не находится ни в одном цикле, поэтому он определенно выполняется только один раз. Думаю, то же самое произошло с использованием сторонних классов регистратора.

Если чужой код демонстрирует такое же поведение, то у вас есть только одна возможная первопричина: код вызывается три раза.

Вероятно, пришло время запустить отладчик и добавить точку останова в свой код, затем пошагово выполнить все, что происходит после первого вызова. Это, несомненно, приведет вас к источнику последующих вызовов.

Возможно, вы также захотите добавить в журнал полную временную метку и микротайм вместо 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. Теперь я понимаю, что отладчик был очевидным способом решить мою проблему, но я новичок, и я впервые использовал его.