У меня около 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, которая может помочь