Попросить php ждать окончания запроса

Nezhnayka

Новичок
Добрый день.

Выполняется один запрос, содержащий в себе ряд запросов по удалению данных из таблиц (т.е. около 20 запросов вроде DELETE FROM ... WHERE .... )

Посылается запрос приблизительно так:
Код:
if ( ! $result = $this->mysqli->multi_query( $sql ) )
     echo json_encode( $this->mysqli->error );
else{
     //что-то делаю
 }
Так вот, где происходит "что-то делаю" не дожидается окончания выполнения запроса, а буквально сразу говорит OK - я все сделал. Но на самом деле запросы по удалению данных из таблиц продолжают работать на протяжении 3-х минут (много данных удаляется).

Скажите пожалуйста, как отловить тот момент, где именно запросы к БД закончат работу, чтобы только после этого сказать OK - я все сделал.

Спасибо.
 

Shasoft

Новичок
Самое простое "решение в лоб" - проверять данные через SELECT - удалились или нет.
 

Nezhnayka

Новичок
Самое простое "решение в лоб" - проверять данные через SELECT - удалились или нет.
Дело в том, что зачистка таблиц производится не полностью, а выборочно по условиям (WHERE), какие данные должны остаться после очистки в таблице заранее не известно.
Конечно можно в какой либо таблице сделать какой-то флаг, вроде того, что перед очисткой ставить его в положение 0, а в конец запросов по очистке добавить запрос по обновлению этой записи на 1 и далее крутясь в цикле отслеживать этот флаг, но чего-то не очень нравится это.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
вообще странно, а без multi_query, то есть если посылать запросы в цикле - так же?
 

Nezhnayka

Новичок
вообще странно, а без multi_query, то есть если посылать запросы в цикле - так же?
Обычным query не пробовал - именно когда скопом бросаю, получаю эффект 3 минут ожидания выполнения.
 

Nezhnayka

Новичок
while ($this->mysqli->next_result()) {}
Так вроде next_result() — Подготовка следующего доступного результирующего набора из multi_query
Результатирующего набора нет, запросы только на DELETE
Или я что-то путаю?
 

MiksIr

miksir@home:~$
Ну все-равно сервер же соообщает о результате операции.
multi_query возвращается после первого запроса в наборе. Остальные запросы выполняются, но их статус вы не запрашиваете, а сразу уходите.
next_result будет выдавать результат каждого следующего запроса или блокироваться, если запрос еще исполняется.
 

Nezhnayka

Новичок
Да, вы правы. Вот так, все работает как надо:
Код:
if ( ! $result = $this->mysqli->multi_query( $sql ) )
    echo json_encode( $this->mysqli->error );
else{
    while ( $this->mysqli->next_result() ){
        $this->mysqli->store_result();
    }
    echo json_encode( "ok. Я все сделал!" );
}
Спасибо.
 
Сверху