СВОБОДОМЫСЛИЕ
/ ИНФ. ТЕХНОЛОГИИ / Разное / Мистическая проблема php - дублируются sql-запросы при сильной нагрузке на скрипт
Мистическая проблема php - дублируются sql-запросы при сильной нагрузке на скрипт
03/08/12 05:01  © LovinGOD
Ничто не предвещало беды, проект, практически закончен, и вот...

Есть php скрипт с mySQL. Что он делает.

1. Создаёт нового пользователя в таблице users
2. Создаёт новую запись в таблице-каталоге вопросов (id, дата, id юзера)
3. Вызывает 40 функций, которые создают картинки, грузят текстовые файлы, парсят их... В max_execution_time это укладывается - порядка 5 секунд занимает.
4. Выполняет 3 SQL-запроса по засовыванию результатов работы п.3 в третью таблицу с данными.

Проблема в чём: пп.1 и 2, кажется, выполняются от 2 до 5 раз. А точнее, по окончании работы скрипта создаётся до 5 пользователей и до 5 новых записей в каталоге вопросов. П.4 иногда не срабатывает вообще.

Создаётся такое ощущение, что скрипт как бы 2-5 раз успевает проработать, пока вызываются те самые тормозные функции из п.3.

Впрочем, это можно обойти, выделив п.3 в отдельный скрип, но это через задницу и, всё равно, как-то очень странно.

Это уже второй раз, когда я сталкиваюсь с подобной проблемой. Она ещё периодически возникает в моих новостных лентах - иногда - в 1-2 случаев из 100, или реже, выпускаемая новость или статья выходит дважды, как-будто скрипт запустили 2 раза. Причём не помогает даже отсев по дублирующемуся тексту.

Вы с таким сталкивались? Мистика какая-то. По крайней мере, не вижу проблем в самом коде, и ИНОГДА ничего подобного не случается.
ВЫБОРКА И КОММЕНТАРИИ
 выборка (0) | обсуждения (1)
(1) Re: Мистическая проблема php - дублируются sql-запросы при сильной нагрузке на скрипт
04/08/12 13:07  © HateGOD
Какой движок БД, Inno, MyISAM? Можно попробовать использовать транзакции - ничего не помещать в БД пока все не готово. Если скрипт действительно запускается от 2 до 5 раз, значит, он где-то и вызывается столько же. Записывать параметры каждого запуска в файл, вместе с timestamp. Один INSERT не может создать нескольких пользователей. Такое случается, если одновременно запустить несколько копий скрипта? Или даже при работе в один поток? Если последнее, то он где-то обращается к самому себе, и создает еще нескольких пользователей, либо в коде наявны два INSERTа.
Ex.time (sec): 0.09912