php - 无法使用 curl_multi 访问字母主机
问题描述
curl 在 Laravel 5.5 和 php7 上工作时遇到了非常奇怪的问题。当我仅使用单个连接时,此 curl 功能没有任何问题:
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
我正在尝试同时多次访问带有信息的本地 php 文件。我将 VHOST 与 apache: server.local 一起使用,文件位于该文件夹 server.local/request.php 中。因此,使用上面的 curl 功能,它可以按我的预期工作。
问题是当我必须在另一个函数中使用它来同时使用 curl_multi 获取多个请求时,这里是代码:
foreach($data as $key => $fetch) {
$info[$key]['name'] = $fetch->name;
$info[$key]['url'] = 'http://server.local/request.php?url='.$fetch->url;
}
$multi = curl_multi_init();
$channels = array();
foreach ($info as $url) {
$ch = curl_init();
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_URL, $url['url']);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_HTTPGET, 1);
//curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
//curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 2 );
//curl_setopt($ch, CURLOPT_PORT, 80);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_REFERER, $url['url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5); //timeout in seconds
curl_multi_add_handle($multi, $ch);
$channels[$url['url']] = $ch;
}
$active = null;
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) == -1) {
continue;
}
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
$i = 0;
dd($channels);
foreach ($channels as $channel) {
$info[$i]['data'] = curl_multi_getcontent($channel);
curl_multi_remove_handle($multi, $channel);
$i++;
}
curl_multi_close($multi);
所以我尝试了 curl_setopt 中带有注释和未注释行的每个组合。没有任何效果!它起作用的唯一方法是当我将 request.php 放在主 web 目录中并将 server.local 更改为 127.0.0.1 时。我什至尝试申请有效的真实网站,但仍然没有得到任何东西。
我在 dd($channels); 中收到的代码 这是:
array:1 [▼
"http://server.local/request.php" => curl resource @276 ▼
url: "http://server.local/request.php"
content_type: null
http_code: 0
header_size: 0
request_size: 0
filetime: -1
ssl_verify_result: 0
redirect_count: 0
total_time: 0.0
namelookup_time: 0.0
connect_time: 0.0
pretransfer_time: 0.0
size_upload: 0.0
size_download: 0.0
speed_download: 0.0
speed_upload: 0.0
download_content_length: -1.0
upload_content_length: -1.0
starttransfer_time: 0.0
redirect_time: 0.0
redirect_url: ""
primary_ip: ""
certinfo: []
primary_port: 0
local_ip: ""
local_port: 0
}
]
就协议而言,在 request.php 中我只有一个 Hello World ...该请求在浏览器加载中返回“Hello World”,甚至在终端 curl 请求中也是如此。我不知道我做错了什么?请帮忙 :/
解决方案
推荐阅读
- javascript - 在页面重新加载时保留字体真棒图标
- c++ - 致命错误:gst/gst.h:没有这样的文件或目录#include
- django-rest-framework - 我正在尝试在主项目 url 中添加两个应用程序 url 以列出具有相同端点的 defaultrouter 但它只显示一个
- javascript - jquery中的响应式单元格选择
- kotlin - 我可以在 Koltin Multiplatform 项目中使用 Spock 测试吗?如果是这样,如何在 gradle.build.kts 中设置?
- oracle - 带有 Db 链接的合并语句不起作用
- node.js - Nodejs - 将指挥官参数传递给永远监控子进程
- python - python问题:sqlite3.ProgrammingError:无法对关闭的游标进行操作
- c - 18446744073709551615ull 的异常行为
- python - Keras 自定义遮罩层