Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 Запись в базу перед die  [new]
Pupkin
Member

Откуда:
Сообщений: 97
Такой фрагмент скрипта:

...
запись в базу MySQL;
if(условие) die();
...

Иногда, если условие есть, то выполняется die, но записи в базе нет. Иногда (не всегда)!
Можно ли предположить, что запись в базу происходит асинхронно (на низком уровне)
и dio успевает остановить выполнение до выполнения записи в базу?

Как гарантированно записать в базу перед dio?

В C++ в классе Application есть метод Application->ProcessMessages();
Есть ли аналог в PHP?
13 янв 19, 11:37    [21783951]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Pupkin,

Обычно функция выполнения запроса к БД возвращает результат выполнения запроса. Результат запросов вида INSERT или UPDATE обычно булево значение TRUE или FALSE. Последний случай вполне возможен, например, при попытке сделать вставку записи с дубликатом по уникальному ключу, и об этом можно сразу же прочитать в сообщении об ошибке. Таким образом, в случае единичного запроса к СУБД не может быть речи об асинхронности на уровне PHP->MySQL.
Однако, если из скрипта вызывается хранимая процедура, которая на каком-то этапе выполнения делает запись, то асинхронный вариант вполне возможен.
13 янв 19, 12:03    [21783957]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
Pupkin
Member

Откуда:
Сообщений: 97
vkle
...функция выполнения запроса возвращает TRUE или FALSE. Таким образом, в случае единичного запроса к СУБД не может быть речи об асинхронности на уровне PHP->MySQL.
Однако, если из скрипта вызывается хранимая процедура..., то асинхронный вариант вполне возможен.
О "хранимке" речь не идет (не обсуждаю).

А возврат значения из DbCnn->query(...) теоретически не гарантирует синхронности.
PHP вполне может вернуть значение после асинхронной обработки через обратный вызов.
Иначе чем можно обосновать отсутствие записи в DB перед выполнением dio?

Но идея хорошая (подумал спасибо). У меня везде DbCnn->query(...). Мне не нужно возвращаемое значение.
Сейчас (перед dio) перепишу так: $r=DbCnn->query(...). Надеюсь "умненький PHP" сообразит, что мне
нужен результат и откомпилит выполнение скрипта в синхронную реализацию.

Пару дне понаблюдаю, потом отпишусь.
13 янв 19, 14:03    [21783991]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Pupkin
А возврат значения из DbCnn->query(...) теоретически не гарантирует синхронности.
Вы считаете, что тот единственный случай, когда ни результат работы запроса вообще никуда не записывается и ни с чем не сравнивается, ни сообщения об ошибке не читаются, ни код ответа не проверяется - в этом случае PHP не ждет ответа от СУБД. Правильно понимаю?
13 янв 19, 16:32    [21784063]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
Pupkin
Member

Откуда:
Сообщений: 97
vkle
Правильно понимаю?
Да. Меня Вы поняли правильно!
Но так ли это на самом деле - не уверен, но предполагаю, что именно так.
Предполагаю потому, что иного обоснования случающемуся (иногда, а не всегда, и в разных
местах, а не в одном и том же, но всегда перед duo) не могу придумать.
13 янв 19, 20:12    [21784209]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Pupkin,

Вполне возможно, что так. Без ковыряния в исходниках (или в документации?) это сложно подтвердить или опровергнуть.

Однако, сталкивался с похожей ситуацией при вызове ХП. Картину такую наблюдал. Сама ХП состояла из десятка запросов + логики. Возвращает несколько рекордсетов. Полное время работы ХП, измеренное средствами SQL между BEGIN и END составляло порядка двух секунд. Но время, за которое отрабатывал метод query() из PDO (расширение, вроде, собрано с мускулячим драйвером ND) оказалось очень маленьким. Сейчас не вспомню точно, вроде десятков или сотни миллисекунд. Затем следовала серия вызовов fetchAll(), слегка разбавленная какой-то обработкой возвращенных данных, и к концу серии время в скрипте и в ХП как-то более-менее сошлись. Из этого я сделал вывод о некоторой асинхронности.

Возможно, PHP действительно ожидает ответа или результата от драйвера MySQL только при явном его использовании в скрипте.

В Вашем случае, вероятно, будет правильным проверить ошибку после выполнения запроса и, если таковая имеется, записать ее в лог-файл (или вывести в браузер) перед завершением скрипта. По крайней мере, будет понятно, что за ошибка произошла.
13 янв 19, 20:57    [21784239]     Ответить | Цитировать Сообщить модератору
 Re: Запись в базу перед die  [new]
Pupkin
Member

Откуда:
Сообщений: 97
vkle
Вполне возможно, что... Без ковыряния в исходниках...
Перед ковырянием надо подумать какова цена победы?
Поэтому (пока только) ожидаю тупую подсказку - делать так, а не делать сяк.

Однако, сталкивался с похожей ситуацией ...
Вашу ситуацию обдумал и resume положил в копилку личного опыта, спасибо.

Кстати об сделать возврат $r=DbCnn->query(...)
Переписал у себя и спровоцировал if(условие) die();
Пока катит правильно. Это для Вашего опыта. Делайте выводы.
13 янв 19, 22:53    [21784316]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить