Недавно возникла следующая ситуация, есть код который прекрасно работает, после обработки полученного xml заносит данные в базу. Но несколько раз данные не занеслись. Проверил, xml есть, данные верные. Проверил лог апача, все чисто, ошибок нет. Сейчас все работает без ошибок. Что произошло, почему данные не занеслись не понятно. У кого какие идеи, что могло произойти?
Что логировать? Я уже логирую xml. Если бы скрипт не смог бы обработать xml то в логе апача должна была быть ошибка, но ошибки нет. Следовательно скрипт получил xml обработал но не добавил в базу. Почему не ясно...
а не могло одновременно несколько экземпляров скрипта работать и, скажем, блокировать доступ к какому-то ресурсу? в логах всё хорошо, потому что ошибка не была просигналена. к примеру облом по time limit разве попадет в лог? или: ошибки и небыло (с т.з. скрипта), просто данные перезаписаны другим экземпляром.
Да такое возможно что работало несколько экземпляров. Но возникает вопрос к какому ресурсу... 1) Скрипт работает с файловой системой - пишет логи запросов. В логе я вижу xml которой нет в базе, следовательно с доступом к файлу все в порядке. 2) Скрипт записывает данные в базу. Не получил доступ к базе? Добавлено спустя 2 минуты 54 секунды: как можно ограничить экземпляры друг от друга?
либо явными блокировками и проверками, либо сделать так, чтобы результаты гарантированно не накладывались. как именно - тебе лучше видно. в базу результат как записывается? если вставка реально не прошла, это как-то отлавливается? для расширения mysql: - успешный mysql_query("INSERT …") вернет TRUE; - mysql_affected_rows() должен вернуть количество добавленных записей. при конфликте их будет меньше, чем ожидалось ))). для проверки попробуй вставить новую запись с уже существующим первичным ключем.
Собственно одну проверку после этой ситуации я поставил, пока работает )) Надеюсь, что больше никаких сюрпризов не будет... Спасибо за советы!
Проверка уже есть, логировать запросы к базе как-то излишне, но для статистики все же добавлю, надо узнать как часто такое может происходить...
а как ты собираешься "узнать" почему что-то не сработало, если не проверить всё по шагам? телепатически?
У меня логируются все шаги, кроме запросы к базе т.к. считаю их лишними. На основе этих логов я и пришел к выводу что на этапе инсерта в базу произошел какой-то сбой. Проверил данные в xml они верные. Следовательно инсерт должен был быть верным. В логах апача нет ошибок следовательно парсер то же отработал правильно. Это не телепатия а логическое рассуждение. Но и ты прав, для упрощения поиска проблемы, нужно добавить логирование запросов к базе, что я и сделаю.
Если возникла ошибка, надо логировать. =) А когда дебагаешь неизвестную хрень, надо логить всё подряд же ж... вообще не понимаю, как связаны два этих факта и на чём базируется твоя уверенность он отработал без ошибок. не больше не меньше. проблема может быть и в хитром сочетании корректных данных. А так как ты не проверяешь на ошибки и не логишь запросы, то хер поймёшь что там было. Можно будет говорить уверенно только после того, как ситуация повторится, а ошибок в запросах не будет. Это фантазии =) ну спасибо йопт ты запросы в бд на удачность проверяешь? Может банально транзацкция не закрылась?
Сложно не согласиться )) На логике ну или же как ты называешь фантазия ))) Если данные в xml верные и в логах нет ошибок, то значить xml должен был распарситься и сформироваться правильный запрос на инсерт. Хотя конечно раз инсерта не было значить где то что то пошло не так как надо... Это верно, но вот чувствую что ошибки в запросе не будет... Не за что Может и такое быть, во всяком случае не стандартная ситуация возникла...
если допустим в запросе значение без кавычек, в xml оно пустое, то парсится без ошибок, в запрос идёт пустая строка и запятая после неё убивает запрос. Ошибок нет, вставки нет. Может быть такое? Хрен знает что ещё может быть. =) Надо логать. А ты проверяешь запрос на успешность?
К сожалению должен признать, что проверки не было. Из xml я беру только 1 значение проверяю, что оно корректно, и со своими данными вставляю в базу. Т.е. данные всегда должны быть верными и инсерт должен быть. И я уверен что инсерт сформировался, но что там дольше произошло для меня пока загадка...
Верный запрос с верными данными - тоже может обломаться. Например, могут быть превышены допустимые пределы на число подключений от одного пользователя MySQL. Или, на сколько я понял, ещё может быть установлено ограничение на число запросов в единицу времени. Ну, мало ли ещё почему запрос может не пройти. Нужно проверять результат выполнения запроса и если запрос не выполнен - то писать в лог сам запрос, а также сообщение об ошибке, полученное от MySQL. Тогда ситуация прояснится.
тут часто упоминаются "логи апача". но могут быть настройки, из-за которых пхп пишет свои ошибки в другие места.