Несколько запросов curl одновременно

#php #api

#php #API

Вопрос:

Например, на одной странице у меня около 30 различных вызовов, таких как [high_shortcode pair=»EURUSD»] ..(самая высокая цена на сегодняшний день для каждой пары (EURUSD, GBPUSD …. и т.д.)), Что резко замедляет открытие html и страницы, потому что результаты ожидают каждого вызовадо последнего и только после этого открывается страница.

Это код, который я использую для одного результата, тот же код, который я использую для другой пары (USDCHF ….) на одной странице.

Можно ли что-то сделать с дополнительным кодом, чтобы сократить время загрузки.

 function high_shortcode($atts){
        
        ob_start();
        $atts = shortcode_atts(array(
            'pair' => '',
        ), $atts, 'high_shortcode');


        $pair = $atts['pair'];

        
        $curl = curl_init(get_option( 'api_address' ).'bars/'.$pair.'?timeframe=PERIOD_D1amp;count=1');

        curl_setopt($curl, CURLOPT_URL, get_option( 'api_address' ).'bars/'.$pair.'?timeframe=PERIOD_D1');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $curl_response = curl_exec($curl);

        if ($curl_response === false) {

            $info = curl_getinfo($curl);
            curl_close($curl);
            die('error occured during curl exec. Additional info: ' . var_export($info));

        }

        curl_close($curl);

        $decoded_result = json_decode($curl_response, true);

        echo round($decoded_result['Bars'][0]['High']);
        

        $content = ob_get_contents();
        ob_end_clean();
        return $content;        
    }
 

я попробовал то же самое с multi curl, но результат тот же

 
function low_shortcode($atts){
        ob_start();
        
        $atts = shortcode_atts(array(
            'pair' => '',
            
        ), $atts, 'low_shortcode');

        $pair = $atts['pair'];
         
$urls = array('https://address.com:443/bars/last/'.$pair.'?timeframe=PERIOD_D1amp;count=1');
$url_count = count($urls);

$curl_arr = array();
$master = curl_multi_init();        
        
for($i = 0; $i < $url_count; $i  )
{
    $url =$urls[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);
}

do {
    curl_multi_exec($master,$running);
} while($running > 0);


for($i = 0; $i < $url_count; $i  )
{
    $results = curl_multi_getcontent  ( $curl_arr[$i]  );
}
        
$decoded_result = json_decode($results, true);

        echo round($decoded_result['Bars'][0]['Low'],$bid_ask_decimal[$pair]);
    
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
        
            
    }   

 

{«Request»:{«Symbol»:»EURUSD»,»Timeframe»:»PERIOD_D1″,»Count»:1},»Bars»:[{«Time»:1623715200,»Symbol»:»EURUSD»,»Timeframe»:»PERIOD_D1″,»Open»: 1.21179, «Высокий»: 1.21259, «Низкий»: 1.21138, «Закрыть»: 1.21250}]}

Комментарии:

1. Проверьте curl_multi_init для одновременных запросов curl. Это означает, что ваш текущий код нуждается в переписывании, хотя

2. Почему бы не кэшировать данные? Я бы предположил, что чистые вызовы cURL довольно сложно использовать таким образом, так почему бы не использовать библиотеку, подобную Guzzle?