在100 req/sec的大流量下优化php multi-curl
我有大约100 res/秒,然后每个请求都被转发到10个不同的URL。我正在使用curl_multi_exec将我的json发布到URL,然后从每个URL接收响应,并根据我的需要对其进行操作。问题是我花了太多的时间在300-500毫秒左右。我需要在不到200毫秒的时间内完成这个过程。我的搭档几乎没有延迟 下面是我的代码:在100 req/sec的大流量下优化php multi-curl,php,curl-multi,Php,Curl Multi,我有大约100 res/秒,然后每个请求都被转发到10个不同的URL。我正在使用curl_multi_exec将我的json发布到URL,然后从每个URL接收响应,并根据我的需要对其进行操作。问题是我花了太多的时间在300-500毫秒左右。我需要在不到200毫秒的时间内完成这个过程。我的搭档几乎没有延迟 下面是我的代码: <?php $post_data = 'some json'; $urls = array( 'url1', 'url2', 'url3',
<?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;
}
?>
我也看了看狂饮,但它似乎需要同样的时间
使用fsocket也无法优化时间
请建议一种方法来优化我的代码或php curl的任何其他替代方案,这可能会有所帮助我刚刚将1微秒更改为100秒,这对我很有用。1微秒不足以处理响应
$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);
}
你应该尝试切换到Node JS,它是非阻塞的。我知道我需要改变我的技术,但是项目太大了,现在无法移动到Node JS。因此,现在只寻找PHP,为什么你会为低级的卷曲细节而烦恼呢?请改用经过验证、维护良好并经过测试的Guzzle库。请求和响应数据的总大小是多少?显然,第二个for循环中的代码块,php现在支持多线程,即使您使用的是较旧的版本,也可以使用“pecl”pthread库进行多线程处理,所以只要开始做这些事情,您就可以开始了
$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);
}