Оптимизация php multi curl при большом трафике 100 рэк / сек - PullRequest
0 голосов
/ 05 ноября 2019

У меня около 100 разрешений в секунду, а затем каждый запрос перенаправляется на 10 разных URL. Я использую curl_multi_exec, чтобы отправить свой json на URL, а затем получить ответ от каждого из них и манипулировать им в соответствии с моими потребностями. Проблема в том, что это занимает слишком много времени у меня около 300-500 мс. Мне нужно, чтобы этот процесс был завершен менее чем за 200 мс. У моих партнеров очень маленькая задержка.

Ниже мой код:

<?php

$post_data = 'some json';
$urls = array(
    'url1',
    'url2',
    'url3',
    'url4',
    'url5',
    'url6',
    'url7',
    'url8',
    'url9',
    'url10',
);

$mh = curl_multi_init();
$curl_array = array();
$curl_error_main = array();
$ping_info = array();
$ping_response = array();

for ( $i = 0; $i < count($urls); $i++)
{
    $curl_array[$i] = get_rtb_ping_curl_request($urls[$i],$post_data);
    curl_multi_add_handle($mh, $curl_array[$i]);
}

$active = null;

do {

        $status = curl_multi_exec($mh, $active);
} while($status === CURLM_CALL_MULTI_PERFORM || $active);


for ( $i = 0; $i < count($urls); $i++)
{

    $curl_error = curl_error($curl_array[$i]);
    $ping_info[$i] = curl_getinfo($curl_array[$i]);
    if (!$curl_error)
    {
        $ping_response[$i] = curl_multi_getcontent($curl_array[$i]);
    }
    else
    {
        $curl_error_main[$i] = $curl_error;
    }
}


for ($i = 0; $i < count($urls); $i++)
{
    curl_multi_remove_handle($mh, $curl_array[$i]);
}
curl_multi_close($mh);


echo 'error';echo "\n";
print_r($curl_error_main);echo "\n";
echo ' curl info ';echo "\n";
print_r($ping_info);echo "\n";
echo ' response' ;echo "\n";
print_r($ping_response);echo "\n";

function get_rtb_ping_curl_request($url,$post_data)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    $request_headers = array(
        "Content-Type: application/json",
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
    curl_setopt($ch, CURLOPT_SSLVERSION, 3);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 2000);
    return $ch;
}

?>

В своем исследовании я обнаружил, что это может быть связано с загрузкой процессора, поэтому изменил свое время до кода ниже, но этоне помогло

do {
    $j++;
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) == -1) {
        usleep(1);
    }

    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}

Я также заглянул в жрет, но, похоже, это займет столько же времени

и использование fsocket также не оптимизирует время.

Пожалуйста, предложитеспособ оптимизировать мой код или любую другую альтернативу php curl, которая может помочь

1 Ответ

0 голосов
/ 07 ноября 2019

Я только что изменил 1 микросекунду на 100, и это сработало для меня. Одной микросекунды недостаточно для обработки ответа

        $active = null;
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        while ($active && $mrc == CURLM_OK) {
            if (curl_multi_select($mh) == -1) {
                usleep(100);
        }

        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }

...