Php Multicurl返回空值,无任何错误(Multicurl已多次使用)
我正在尝试执行multicurl请求并保留有关发送的数据的信息(通过GET)。我有一个数组“$params”,其中包含我要发送多个卷发的参数: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
$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);