За последние 24 часа нас посетили 21782 программиста и 1394 робота. Сейчас ищут 702 программиста ...

проблема зависания функции ...

Тема в разделе "PHP для профи", создана пользователем Иван518, 27 янв 2024.

  1. Иван518

    Иван518 Новичок

    С нами с:
    27 янв 2024
    Сообщения:
    1
    Симпатии:
    0
    есть функция а в ней прописан внешний адрес для отправки данных API -
    CURLOPT_URL=>'http://*.*/xml.php
    CURLOPT_CONNECTTIMEOUT=>15,
    CURLOPT_TIMEOUT=>40
    при зависании этого внешнего сайта *.* нет ответа или что типа этого , виснет вся страница в php с этой фyнкцией внутри!
    Как избежать такого ? чтоб выполнение происходило независимо получилось или нет связаться с внешней ссылкой а двигаться дальше полюбому! Вроде все прописано выше но останавливается мертво страница и после 40 секунды!
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    262
    Симпатии:
    52
    Адрес:
    Бавария, Германия
    Для начала попробуйте ввести URL 'http://*.*/xml.php в адресную строку браузера.
    Затем попробуйте проверить ошибки в response см. https://www.php.net/manual/en/function.curl-error.php
    Удачи!
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    262
    Симпатии:
    52
    Адрес:
    Бавария, Германия
    В дополнение.
    Бывает, что получив response, его парсят как успешное (по XSLT схеме).
    Если нет проверки стауса, попытка спарсить неуспешное response закачивается фатальной ошибкой.
    Вы предполагаете, что виснет cURL, а на самом деле "виснет" парсе, а Вы, возможно, этого не видите.
    Поэтому обязательно в PHP должен быть включён error_reporting.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Иван518 в общем случае, надо делать запрос к внешнему сервису асинхронно. то есть выставили задание и вернулись к своим делам. а потом проверяете готовность и принимаете решение считать запрос проваленным или нет.

    обычно на генерацию страницы у php настроен лимит, например 30 сек. а консольные скрипты без лимита. сие есть великая мудрость! :)
    у запроса curl тодже есть свои лимиты времени, после которых он возращает статус ошибки. желательно чтобы твой скрипт не грохнулся раньше чем дождется ответа. при этом реакция на веб-запрос (т.е. генерация странички) должна быть максимально быстрой. иначе сам себе спровоцируешь DoS.

    пусть проверку статуса долгоиграющего запроса делает JS с уже сгенерированной странички. пусть "пингует" эндпоинт проверки статуса. возможны ещё варианты оповещения через websocket но можно не усложнять стек раньше времени.
     
  5. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    262
    Симпатии:
    52
    Адрес:
    Бавария, Германия
    Добрый день!
    В общем случае, может быть, но в каждом конкретном случае это определяется разработчиками Вебсервисов в документации.
    Например, Вебсервисы агрегаторов отелей.
    Как праивило, у них предусмотрены запросы на получения статической информации и запросы на поиск номеров и их бронирование.
    Статическая информации это - коды городов, данные отелей в каждом городе и.т.п
    Запросы на получения статической информации никак не связаны в конкретным бронированием и могут обработыватся синхронно или асинхронно и результы обработки запросов записываются в БД.
    Запросы на поиск номеров и их бронирование обрабатываются только синхронно.
    Поситель сайта вводит критерии поиска и нажимает кнопку "искать".
    Все, кто бронировал отели онлайн, наверно замечали, что результат поиска выводится через несколько секунд.

    И ещё один пример.
    Обычно процесс бронирования или покупки товара заканчивается оплатой.
    При этом отправлются запросы к платежным сервисам.
    Эти запросы обрабатываются только асинхронно. На севисах в админ панели клиента определются url на,
    которые должны отправляться response в случаях успешного завершения транзакций и в противном случае.
     
    #5 Vladimir Kheifets, 2 фев 2024
    Последнее редактирование: 2 фев 2024
    artoodetoo нравится это.