PHP cURL http 200, подождите и запустите новый URL

Необходимость изменения существующего кода для использования нового вызова асинхронного API. В оригинале cURL используется для отправки запроса и получения результатов. Новый метод требует, чтобы я отправил запрос инициализации, подождал 10-20 секунд или пока http 200 не вернется, а затем отправил запрос cURL и использовал результаты, но не раньше, чем проверяю статус «Завершено».

Я новичок в просмотре cURL и изо всех сил пытаюсь разобраться в многочисленных сообщениях, связанных с ним, любая помощь приветствуется. Код такой:

function check_boomi($service_id) {
$status = "";

Инициализировать новый вызов Northbound API

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init? 
ServiceID = ".$service_id."");

Дождитесь ответа http 200 перед запуском запроса

sleep(20);
$result = curl_exec($ch);

Запустить запрос Northbound API

curl_setopt($ch, CURLOPT_URL, "http://testurl.com/query? 
ServiceID = ".$service_id."");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Cache-Control: no-cache";
$headers[] = "Postman-Token: d2d57c3e-7c5d-df1b-4b61-dacb6c44b7cg";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} 

Проверить статус результата:

Если «Обработка», подождите 20 секунд и повторите попытку. Если "Завершено", используйте возвращаемые данные.

curl_close ($ch);
$data = json_decode($result);
return $data;}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 075
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пропустил несколько строк, чтобы вы могли лучше понять логику, и разделил код на 2 метода:

  • initApi - вызывает запрос инициализации api и ожидает ответа не более 20 секунд
  • runQuery - вызывает запрос api request - возвращает данные, если они доступны, в противном случае ожидает, например, 20 секунд и попробуйте еще раз

    //set max execution time to e.g. 2 minutes
    ini_set('max_execution_time', 120);
    
    initApi($service_id);
    $data = runQuery();
    
    function initApi($service_id){
        $ch = curl_init();
        //set init-url and all relevant curl headers
        curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init?ServiceID = ".$service_id."");
        //set request timeout to 20 seconds - when taking longer we check with runQuery
        curl_setopt($ch, CURLOPT_TIMEOUT, 20)
    
        $result = curl_exec($ch);
    }
    
    function runQuery(){
        $ch = curl_init();
        //set query url and all relevant headers
    
        $result = curl_exec($ch);
        if (!curl_errno($ch)) {
            //check the response if it's still "processing" or "completed" - i'm not sure how the api returns that
            $status = 
            if ($status == "processing") {
                //wait for 20 seconds and call query again
                sleep(20);
                return runQuery();
            }
            else{
                //return data
            }
        }
    }
    

Вы также можете уменьшить тайм-аут сна - тогда запрос вызывается чаще и будет проверять, доступен ли результат (я предполагаю, что запрос запроса не блокируется)

И не забудьте установить max_execution_time - по умолчанию, вероятно, 30 секунд - если ваш скрипт работает дольше, запрос завершится ошибкой.

Другие вопросы по теме