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