Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在100 req/sec的大流量下优化php multi-curl_Php_Curl Multi - Fatal编程技术网

在100 req/sec的大流量下优化php multi-curl

在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',

我有大约100 res/秒,然后每个请求都被转发到10个不同的URL。我正在使用curl_multi_exec将我的json发布到URL,然后从每个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;
}

?>
我也看了看狂饮,但它似乎需要同样的时间

使用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);
        }