Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PHP, Perl, Python |
![]() ![]() |
Pupkin Member Откуда: Сообщений: 93 |
Такой фрагмент скрипта: ... запись в базу MySQL; if(условие) die(); ... Иногда, если условие есть, то выполняется die, но записи в базе нет. Иногда (не всегда)! Можно ли предположить, что запись в базу происходит асинхронно (на низком уровне) и dio успевает остановить выполнение до выполнения записи в базу? Как гарантированно записать в базу перед dio? В C++ в классе Application есть метод Application->ProcessMessages(); Есть ли аналог в PHP? |
13 янв 19, 11:37 [21783951] Ответить | Цитировать Сообщить модератору |
vkle Member Откуда: Самара Сообщений: 14450 |
Pupkin, Обычно функция выполнения запроса к БД возвращает результат выполнения запроса. Результат запросов вида INSERT или UPDATE обычно булево значение TRUE или FALSE. Последний случай вполне возможен, например, при попытке сделать вставку записи с дубликатом по уникальному ключу, и об этом можно сразу же прочитать в сообщении об ошибке. Таким образом, в случае единичного запроса к СУБД не может быть речи об асинхронности на уровне PHP->MySQL. Однако, если из скрипта вызывается хранимая процедура, которая на каком-то этапе выполнения делает запись, то асинхронный вариант вполне возможен. |
13 янв 19, 12:03 [21783957] Ответить | Цитировать Сообщить модератору |
Pupkin Member Откуда: Сообщений: 93 |
А возврат значения из DbCnn->query(...) теоретически не гарантирует синхронности. PHP вполне может вернуть значение после асинхронной обработки через обратный вызов. Иначе чем можно обосновать отсутствие записи в DB перед выполнением dio? Но идея хорошая (подумал спасибо). У меня везде DbCnn->query(...). Мне не нужно возвращаемое значение. Сейчас (перед dio) перепишу так: $r=DbCnn->query(...). Надеюсь "умненький PHP" сообразит, что мне нужен результат и откомпилит выполнение скрипта в синхронную реализацию. Пару дне понаблюдаю, потом отпишусь. |
||
13 янв 19, 14:03 [21783991] Ответить | Цитировать Сообщить модератору |
vkle Member Откуда: Самара Сообщений: 14450 |
|
||
13 янв 19, 16:32 [21784063] Ответить | Цитировать Сообщить модератору |
Pupkin Member Откуда: Сообщений: 93 |
Но так ли это на самом деле - не уверен, но предполагаю, что именно так. Предполагаю потому, что иного обоснования случающемуся (иногда, а не всегда, и в разных местах, а не в одном и том же, но всегда перед duo) не могу придумать. |
||
13 янв 19, 20:12 [21784209] Ответить | Цитировать Сообщить модератору |
vkle Member Откуда: Самара Сообщений: 14450 |
Pupkin, Вполне возможно, что так. Без ковыряния в исходниках (или в документации?) это сложно подтвердить или опровергнуть. Однако, сталкивался с похожей ситуацией при вызове ХП. Картину такую наблюдал. Сама ХП состояла из десятка запросов + логики. Возвращает несколько рекордсетов. Полное время работы ХП, измеренное средствами SQL между BEGIN и END составляло порядка двух секунд. Но время, за которое отрабатывал метод query() из PDO (расширение, вроде, собрано с мускулячим драйвером ND) оказалось очень маленьким. Сейчас не вспомню точно, вроде десятков или сотни миллисекунд. Затем следовала серия вызовов fetchAll(), слегка разбавленная какой-то обработкой возвращенных данных, и к концу серии время в скрипте и в ХП как-то более-менее сошлись. Из этого я сделал вывод о некоторой асинхронности. Возможно, PHP действительно ожидает ответа или результата от драйвера MySQL только при явном его использовании в скрипте. В Вашем случае, вероятно, будет правильным проверить ошибку после выполнения запроса и, если таковая имеется, записать ее в лог-файл (или вывести в браузер) перед завершением скрипта. По крайней мере, будет понятно, что за ошибка произошла. |
13 янв 19, 20:57 [21784239] Ответить | Цитировать Сообщить модератору |
Pupkin Member Откуда: Сообщений: 93 |
Поэтому (пока только) ожидаю тупую подсказку - делать так, а не делать сяк.
Пока катит правильно. Это для Вашего опыта. Делайте выводы. |
||||||
13 янв 19, 22:53 [21784316] Ответить | Цитировать Сообщить модератору |
Все форумы / PHP, Perl, Python | ![]() |