Как продолжить выполнение скрипта только после определённого ответа с culr?
Здравствуйте.
Ситуация такая: отправляю запрос. В ответе может быть либо: {"Статус: 2"} - Ответ подготавливается. {"Статус: 0", "Данные"} - всё хорошо, данные сформированы.
Как сделать, чтобы скрипт продолжил выполнятся только после получения ответа? И если в ответе Статус: 2, то он опять начнёт ждать ответ.
Вариант со sleep(), который предлагает гугл, мне кажется очень странным, ведь ответ может идти и 1 секунду, а может и 10 секунд. Не угадаешь такое.
Мне это нужно, потому что нужно дальше работать с этими данными, а на деле получается так, что ответ ещё не получен, а скрипт уже выполнил второй этап (разумеется с ошибкой).
p.s. статус может быть сразу 0. Статус 2 бывает, но не всегда.
twobomb, немного тупанул. так. ещё раз. если sleep убрать, то он будет работать с той скорость с какой вообще это возможно? типа запрос раз 0.001 секунд?
qqignatqq, Курл это же синхронный запрос, поэтому он будет работать со скоростью ответа от сервера, а сервер может долго отвечать. Ну лучше со слипом, чтобы не спамить
qqignatqq, Всё правильно отработало, эхо вывел результат (no) , условие while($result == "yes") вернуло false, и всё вышло из цикла. А вот если бы стояло while($result == "no"), то всё было бы верно и скрипт навечно завис как и положено
Для правильного вопроса надо знать половину ответа
А кроме цикла ожидания здесь ничего и не сделать. Просто в бесконечном цикле проверяете состояние, если статус 0, то покидаете цикл, если 2, то делаете задержку (sleep) и повторяете запрос.
qqignatqq, Oberver здесь совсем не при чём, он контролирует изменение состояния объектов той же самой задачи. Попробуйте, например, прицепить observer его к объекту на другой странице, в другом браузере, на другом компьютере.
У вас же, если сервер отправляет ответ о состоянии только в ответ на запрос, то всё равно этот запрос надо послать. Либо устанавливать какое-то постоянное соединение, по которому сервер подаст сигнал о готовности, но для этого придётся менять код и сервера и клиента.
qqignatqq, Попробуйте объяснить, что именно вы собираетесь ждать? Сообщения от сервера? Так его не будет, поскольку сервер не рассылает сообщений. Он только отвечает на запросы клиентов.
Делаю запрос /result. Время от времени получаю статус 1 или 2.
do {
$proverka = 0
if ($proverka >= 1) {
if ($proverka >= 10) {
e("КРИТИЧЕСКАЯ ОШИБКА. ПРИСТАВЫ НЕ ОТВЕЧАЮТ НА ЗАПРОС");
break;
}
sleep(2);
}
$proverka++;
} while ($status != 0);
e("sleep был выполнен:" . ($proverka - 1) . "раз");
На данный момент у меня вот такой костыль. Такое чувство, что есть какое-то встроенное свойство, чтобы не было этой долбаной задержки в 2 секунды и не было этого спама, если я задержку уберу.
Со sleep я намеренно замедляю скорость скрипта, что мне совсем не нравится.
Если sleep отключу, то буду спамить, что тоже мне совсем не нравится.