Php Multicurl返回空值,无任何错误(Multicurl已多次使用)

Php Multicurl返回空值,无任何错误(Multicurl已多次使用),php,curl,Php,Curl,我正在尝试执行multicurl请求并保留有关发送的数据的信息(通过GET)。我有一个数组“$params”,其中包含我要发送多个卷发的参数: $m_curl = curl_multi_init(); // Firstly I create CURL handles for ($i = 0; $i < count($params); ++$i) { $params[$i]['curl'] = curl_init(); curl_setopt($params[$i]['c

我正在尝试执行multicurl请求并保留有关发送的数据的信息(通过GET)。我有一个数组“$params”,其中包含我要发送多个卷发的参数:

$m_curl  = curl_multi_init();

// Firstly I create CURL handles
for ($i = 0; $i < count($params); ++$i) {
    $params[$i]['curl'] = curl_init();
    curl_setopt($params[$i]['curl'], CURLOPT_HEADER, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_VERBOSE, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_URL, $params[$i]['url']);
    curl_multi_add_handle($m_curl, $params[$i]['curl']);
}

// Now we do the multicurl thing
$active = null;
do {
    $status = curl_multi_exec($m_curl, $active);
    if ($status > 0) die ('ERROR!'); // This is not stopping script, so I suppose that we got no errors in requests
} while ($status == CURLM_CALL_MULTI_PERFORM);

// Organize response
for ($i = 0; $i < count($params); ++$i) {
    $results[$i] = ['results' => []];

    foreach ($params[$i]['curl'] as $curl) {
        $result        = curl_multi_getcontent($curl);
        $header_size   = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $result_header = substr($result, 0, $header_size);
        $result_body   = substr($result, $header_size);

        // We got wrong result - response is NULL
        if ($result == NULL) {
           echo 'empty response!'; // and there should be something
        }
        else {
           // it's OK, co we do stuff there
           // ...
           curl_multi_remove_handle($m_curl, $curl);
        }
    }
}

// Close multicurl
curl_multi_close($m_curl);
$m_curl=curl_multi_init();
//首先,我创建卷曲控制柄
对于($i=0;$i0)die('ERROR!');//这并不是在停止脚本,所以我认为我们在请求中没有错误
}而($status==CURLM\u CALL\u MULTI\u PERFORM);
//组织响应
对于($i=0;$i[]];
foreach($params[$i]['curl']作为$curl){
$result=curl\u multi\u getcontent($curl);
$header\u size=curl\u getinfo($curl,CURLINFO\u header\u size);
$result\u header=substr($result,0,$header\u size);
$result\u body=substr($result,$header\u size);
//我们得到了错误的结果-响应为空
如果($result==NULL){
echo“empty response!”;//应该有什么东西
}
否则{
//没关系,我们在那里做事
// ...
curl\u multi\u remove\u句柄($m\u curl,$curl);
}
}
}
//关闭多URL
curl\u multi\u close($m\u curl);
有了这样的代码,我得到了: -无卷曲错误(状态始终为0) -有时结果是好的,我们得到了响应文本,有时没有(然后我们没有身体,也没有头去调试)

最后一件事——如果我浏览multicurl中为空的URL(或发送常规CURL),则响应是正确的。我无法遵循任何模式,所以也许有人能指出我做错了什么或我忘记了做什么=/

已解决:事实上,问题并不是我所期望的那样。我使用了一次性multicurl,添加句柄,执行它们并删除它们。在这之后,我添加了其他句柄,在执行之后,它们得到的结果是空的(但发送到服务器的请求是空的)。 当我每次放置新数据部分时关闭并重新打开multicurl时,问题就解决了。 对不起,问错了问题=/

如果有人遇到同样的问题,希望它能有所帮助。

试试这段代码

    <?php

$params = [
  ['curl' => null, 'url' => "http://google.com"],
  ['curl' => null, 'url' => "http://google.com"],
];

$m_curl  = curl_multi_init();

for ($i = 0; $i < count($params); ++$i) {
    $params[$i]['curl'] = curl_init();
    curl_setopt($params[$i]['curl'], CURLOPT_HEADER, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_VERBOSE, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($params[$i]['curl'], CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($params[$i]['curl'], CURLOPT_URL, $params[$i]['url']);
    curl_multi_add_handle($m_curl, $params[$i]['curl']);
}

$active = null;
do {
    $status = curl_multi_exec($m_curl, $active);
    if ($status > 0) die ('ERROR!');
} while ($status == CURLM_CALL_MULTI_PERFORM);

while ($active && $status == CURLM_OK) {
    if (curl_multi_select($m_curl) != -1) {
        do {
            $status = curl_multi_exec($m_curl, $active);
        } while ($status == CURLM_CALL_MULTI_PERFORM);
    }
}

$result = [];
foreach ($params as $param) {
    $curl_result = curl_multi_getcontent($param['curl']);
    $header_size  = curl_getinfo($param['curl'], CURLINFO_HEADER_SIZE);
    $result[] = [
        "header" => substr($curl_result, 0, $header_size),
        "body" => substr($curl_result, $header_size)
    ];

    curl_multi_remove_handle($m_curl, $param['curl']);
}

curl_multi_close($m_curl);

var_dump($result);