Я использую PHP для получения содержимого API. Проблема в том, что иногда API просто отправляет обратно ошибку 502 Bad Gateway, и PHP-код не может разобрать JSON и правильно установить переменные. Есть ли способ, которым я могу продолжать попытки, пока это не сработает?Могу ли я повторить file_get_contents(), пока он не откроет поток?
ответ
Поскольку вы не предоставили никакого кода, вам сложно помочь. Но вот один из способов сделать это.
$data = null;
while(!$data) {
$json = file_get_contents($url);
$data = json_decode($json); // Will return false if not valid JSON
}
// While loop won't stop until JSON was valid and $data contains an object
var_dump($data);
Я предлагаю вам бросить какое-то приращение переменной там, чтобы прекратить попытки после X
сценариев.
Спасибо, я попробую это сейчас. У меня это работает на работу cron, поэтому потребуется несколько минут для тестирования. – Burrito411
Это непростой вопрос, поскольку по умолчанию PHP является синхронным.
Вы можете сделать это:
$a = false;
$i = 0;
while($a == false && $i < 10)
{
$a = file_get_contents($path);
$i++;
usleep(10);
}
$result = json_decode($a);
Добавление usleep(10)
позволяет серверу, чтобы не получить на колени каждый раз, когда API будет недоступен. И ваша функция будет сдаваться после 10 попыток, что предотвратит ее полностью заморозить в случае большой недоступности.
Основываясь на ваш комментарий, вот что я хотел бы сделать:
- У вас есть PHP скрипт, который делает вызов API и, в случае успеха, регистрирует цену и, когда эта цена была приобретена
- Вы поместите этот скрипт в задание cronjob/schedule, которое выполняется каждые 10 минут.
- Ваш взгляд на PHP вытаскивает самую последнюю цену из базы данных и использует ее для любых отображаемых/вычислений, которые ей нужны. Если уместно, также покажите дату/время, когда была зафиксирована цена.
Другие ответы предлагают сделать цикл. Комбинированный подход, вероятно, лучше всего работает здесь: в вашем скрипте вставляйте несколько циклов на всякий случай, если интерфейс отключен для короткого перехода. Если после минуты не говорят, используйте старое значение до следующей попытки.
Он делает, он работает отлично. У меня есть он, где он записывается в базу данных после цикла while, если $ lasttradeprice (моя переменная, которую я получаю от JSON)! == 0. – Burrito411
Тогда вам будет хорошо идти ко мне! – bishop
Хорошо, приятно слышать, что меня не будут запрещать - надеюсь. Все запросы, похоже, дали число, не достигнув максимального предела запроса, установленного мной (10). – Burrito411
Петля может решить эту проблему, но так может рекурсивная функция как этот:
function file_get_contents_retry($url, $attemptsRemaining=3) {
$content = file_get_contents($url);
$attemptsRemaining--;
if(empty($content) && $attemptsRemaining > 0) {
return file_get_contents_retry($url, $attemptsRemaining);
}
return $content;
}
// Usage:
$retryAttempts = 6; // Default is 3.
echo file_get_contents_retry("http://google.com", $retryAttempts);
Не забудьте использовать строгое сравнение: if ($ content === false). Если ответ содержит «0», то он вызывает ложный ответ. –
@DenisBobrovnikov поднимает превосходный момент.В моем случае я получал код состояния 200 с пустым ответом на строку и мне нужно было продолжать повторную попытку, пока я не получил фактический ответ. Ваш прецедент может отличаться и может требовать строгого логического сравнения возвращаемого значения. – Eric
- 1. не может повторить содержание функции внутри file_get_contents
- 2. Как долго проходит поток Random(). Next(), пока он не повторится?
- 3. Как я могу повторить тест по достижимости до тех пор, пока он не сработает
- 4. Могу ли я прерывать git pull (пока он просит слияния)?
- 5. file_get_contents() не удалось открыть поток:
- 6. убить поток python, пока он долго читает.
- 7. Как я могу «повторить попытку»?
- 8. Могу ли я повторить наследование с перегрузкой?
- 9. Обновление svn: могу ли я повторить результаты?
- 10. Могу ли я бросить поток?
- 11. Как я могу прокомментировать каждый поток и повторить результат?
- 12. Могу ли я повторить команду в irb?
- 13. Loadrunner, могу ли я повторить неудачные итерации?
- 14. Как я могу сохранить приложение узла, пока поток открыт?
- 15. Могу ли я программно определить, какое приложение откроет данный URL?
- 16. Как я могу это повторить
- 17. file_get_contents: не удалось открыть поток: Хост опущен
- 18. file_get_contents() не удалось открыть поток: Нет ошибки
- 19. file_get_contents с http - Не удалось открыть поток
- 20. Как я могу повторить mHandler.postDelayed()?
- 21. Могу ли я заблокировать поток пользовательского интерфейса браузера до тех пор, пока не наступит обещание Angularjs?
- 22. NetBeans не откроет
- 23. Как я могу завершить поток C++ 11, пока он ждет std :: cin?
- 24. php - file_get_contents/fread непрерывный поток ввода
- 25. Как я могу сделать поток ждать, пока другой поток не будет (C#)
- 26. file_get_contents мне не удалось открыть поток
- 27. Я не могу повторить определенные верификации?
- 28. Zend_Feed_Rss - Я могу повторить, но я ничего не могу сделать?
- 29. Могу ли я читать поток, создаваемый open_memstream()?
- 30. Могу ли я использовать ostream как поток?
завернуть его в какой-то цикл, как 'в то время как ($ thatdamngatewayisntproperlyresponding) {...}'? – fvu
«Я могу продолжать пытаться, пока это не сработает ...», или вы получите запрет, и он никогда не будет работать снова. Лучше сделать что-то другое в своем приложении при сбое API, например: заменить значения по умолчанию, серость соответствующих вычисленных полей, записать блокировку интерфейса, использовать последние значения и т. Д. – bishop
Интересно ... что он делает, это экономит цену на мой сервер. На самом деле нет значения по умолчанию там, но я полагаю, я мог бы получить предыдущую строку MySQL и вставить ее снова. – Burrito411