PHP curl_multi_getcontent返回null

Bla*_*umb 10 php curl curl-multi

我一直在关注如何使用本教程curl_multi.http://arguments.callee.info/2010/02/21/multiple-curl-requests-with-php/

我不知道我做错了什么,但是curl_multi_getcontent返回null.假设返回JSON.我知道这不是mysql调用,因为我使用了while循环和标准curl_exec,但页面加载时间过长.(我已经更改了一些setopt详细信息以确保安全性)

相关的PHP代码段.我最后关闭了while循环.

$i = 0;
$ch = array();
$mh = curl_multi_init();
while($row = $result->fetch_object()){
   $ch[$i] = curl_init();
   curl_setopt($ch[$i], CURLOPT_CAINFO, 'cacert.pem');
   curl_setopt($ch[$i], CURLOPT_USERPWD, "$username:$password");
   curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true); 
   curl_setopt($ch[$i], CURLOPT_URL, 'https://mysite.com/search/'.$row->username.'/');
   curl_multi_add_handle($mh, $ch[$i]);
   $i++;
}
$running = 0;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);
$result->data_seek(0);
$i = 0;
while ($row = $result->fetch_object()) {
    $data = curl_multi_getcontent($ch[$i]);
    $json_data = json_decode($data);
    var_dump($json_data);
Run Code Online (Sandbox Code Playgroud)

编辑

这是当前可用的代码,但导致页面加载速度太慢

$ch = curl_init();
curl_setopt($ch, CURLOPT_CAINFO, 'cacert.pem');
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
while($row = $result->fetch_object()){
   curl_setopt($ch, CURLOPT_URL, 'https://mysite.com/search/'.$row->username.'/');
   $data = curl_exec($ch);
   $json_data = json_decode($data);
   var_dump($json_data);
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*onR 2

我在想:

$i = 0;
while ($row = $result->fetch_object()) {
    $data = curl_multi_getcontent($ch[$i]);
    $json_data = json_decode($data);
    var_dump($json_data);
Run Code Online (Sandbox Code Playgroud)

您是否忘记增加 $i ?如果是这样,您已经获取了 $ch[0] 的内容,然后再次调用curl_multi_getcontent。

另外,我还写了一篇博客文章,介绍了PHP 的 cURL 扩展的并发请求,其中包含用于 curl 多请求的通用函数。您可以通过以下方式调用该函数:

$responses = multi([
    $requests = [
        ['url' => 'https://example.com/search/username1/'],
        ['url' => 'https://example.com/search/username2/'],
        ['url' => 'https://example.com/search/username3/']
    ]
    $opts = [
        CURLOPT_CAINFO => 'cacert.pem',
        CURLOPT_USERPWD => "username:password"
    ]
]);
Run Code Online (Sandbox Code Playgroud)

然后,循环遍历响应数组:

foreach ($responses as $response) {
    if ($response['error']) {
        // handle error
        continue;
    }
    // check for empty response
    if ($response['data'] === null) {
        // examine $response['info']
        continue;
    }
    // handle data
    $data = json_decode($response['data']);
    // do something
}
Run Code Online (Sandbox Code Playgroud)

使用此函数,您可以使用以下调用进行访问 https 站点的简单测试:

multi(
    $requests = [
        'google' => ['url' => 'https://www.google.com'],
        'linkedin' => ['url'=> 'https://www.linkedin.com/']
    ],
    $opts = [
        CURLOPT_CAINFO => '/path/to/your/cacert.pem',
        CURLOPT_SSL_VERIFYPEER => true
    ]
);
Run Code Online (Sandbox Code Playgroud)