【发布时间】:2013-09-13 23:26:20
【问题描述】:
我一直在关注如何使用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代码sn-p。最后我确实关闭了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);
编辑
这是当前可以运行的代码,但会导致页面加载太慢
$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);
}
【问题讨论】:
-
CURLOPT_USERPWD 假设您在网站上有 http 密码验证。如果以这种方式设置,请将代码更改为 curl_setopt($ch[$i], CURLOPT_USERPWD, "$username:$password");用双引号。
-
你有没有 var_dumped
$ch[$i]看看它是否包含它应该包含的内容? -
@velcrow 刚刚在您发表评论之前就注意到了这个错误。我以为它会解决它,但它没有。 :(
-
还可以尝试将
var_dump(curl_error($ch[$i]));与curl_errno结合使用 -
好吧,这很奇怪。 curl 库、SSL 和
curl_multi_init过去曾出现过错误,但这些通常是内存泄漏。我认为CURLOPT_CAINFO选项不是问题,而是 curl 库无法协商 SSL 协议。使用CURLOPT_SSL_CIPHER_LIST分配密码可能会有所帮助,但不能保证。此外,请仔细检查CURLOPT_URL中发送的 URL,如果您的 DNS 提供商将失败的 DNS 请求重定向到另一台主机,则可能会导致此错误。
标签: php curl curl-multi