PHP - curl 本地主机连接被拒绝

Jsh*_*h0s 3 php api rest curl localhost

解释

我用 Java (GET) 制作了一个简单的 REST api。

  • 邮递员工作(本地主机和IPv4)

  • curl 从命令行工作(本地主机和 IPv4)

  • 来自不同城市的外部请求工作(IPv4)


预期的

让 PHP curl 在本地主机上工作

实际的

出于某种原因,IPv4 上的 PHP curl 有效,但 localhost 无效


PHP curl 输出错误

  • 无法连接到本地主机端口 8080:连接被拒绝

  • 卷曲错误:7


代码

$url = 'http://localhost:8080/api/user';
$curl = curl_init($url);
echo json_decode(curl_exec($curl));
Run Code Online (Sandbox Code Playgroud)

我已经尝试过 (从我的头顶开始,没有特定的顺序)

curl_setopt ($curl, CURLOPT_PORT , 8080);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
Run Code Online (Sandbox Code Playgroud)

Ser*_*pov 7

对于那些使用 Docker、Vargant 等的人。

您遇到Failed to connect to localhost port 8080: Connection refused错误,因为您尝试从虚拟机(如 Docker)内部连接到 localhost:8080,该主机在 Docker 容器内不可用,因此您应该添加一个可以从外部访问端口的代理。

要解决此问题,请在您的curl_init()以下代码之后添加下一行代码:

curl_setopt($ch, CURLOPT_PROXY, $_SERVER['SERVER_ADDR'] . ':' .  $_SERVER['SERVER_PORT']);
Run Code Online (Sandbox Code Playgroud)

这是一个完整的例子:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $APIUrl);

if ($_SERVER['HTTP_HOST'] == 'localhost:8080') {
    // Proxy for Docker
    curl_setopt($ch, CURLOPT_PROXY, $_SERVER['SERVER_ADDR'] . ':' .  $_SERVER['SERVER_PORT']);
}

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

if (curl_errno($ch)) {
    $error = curl_error($ch);
}

curl_close($ch);
Run Code Online (Sandbox Code Playgroud)