Задержку по времени в синхронном коде вставлять нельзя. будет тормозить всё приложение (оно же однопоточное). Делай задержку в асинхронном режиме. Тебе надо написать функцию, которая будет выполнять запрос и проверять, заполнилась ли переменная нужным значением. Если да - то возвращай его, если нет - делай задержку и повторяй. ПХП я не знаю (и как там работать с корутинами тоже). Ты сам почитай, например, вот
это. Я приведу пример, как это можно сделать на питоне с пояснениями, на ПХП сам перепиши. Итак:
import asyncio # модуль, который позволяет работать в асинхронном режиме
import random
# "сообщаем", что функция получения данных будет исполняться как сопрограмма
@asyncio.coroutine
def fetch_data():
data = 0
# Для примера, будем запрашивать данные, пока не выпадет 6-ка.
# в реале, вместо получения рандома, ты должен делать запрос к БД
while not data == 6:
print(data)
data = random.randint(0, 10) # вот тут делай запрос к БД и заполняй твою переменную
yield from asyncio.sleep(3.0) # асинхронная задержка, она не будет блокировать приложение
return data # когда вышли из цикла, в переменной data будет только нужная инфа
# эта функция тоже будет исполняться как сопрограмма. без этого декоратора невозможно получать асинхронно данные через yield from
@asyncio.coroutine
def test():
# получаем данные асинхронно
# переменная data заполнится только тогда, когда в функции fetch_data выпадет 6,
# она выйдет из цикла и вернёт значение
data = yield from fetch_data()
print('Bingo!', data)
loop.stop() # когда получили данные, останавливаем асинхронный цикл
# ты не должен останавливать, чтобы каждый раз не запускать цикл при получении данных
# ты должен просто вернуть данные клиенту
if __name__ == '__main__':
loop = asyncio.get_event_loop() # создаём цикл
asyncio.async(test()) # асинхронно запускаем функцию
# тебе это надо делать при каждом запросе на какой-то УРЛ
# По-сути, в обработчике УРЛ ты должен просто вызывать функцию test,
# а она уже отошлёт данные клиенту
loop.run_forever() # запускаем бесконечный асинхронный цикл
loop.close()
# если он завершится (у меня он завершается, когда получена 6-ка), надо закрыть цикл
Ну или вариант попроще, на клиенте создай функцию, которая будет отправлять AJAX-запрос к серверу и ставь таймер в 3 секунды. Когда вернётся непустое значение, тормози таймер.