说明
我用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));
我尝试过 (从我的头顶开始,没有特定顺序)
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);
答案 0 :(得分:1)
对于那些使用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']);
这是一个完整的例子:
$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);
答案 1 :(得分:0)
我不确定这是否可以作为答案,但是我刚刚重新启动了Linux VM,现在它可以正常工作了。
答案 2 :(得分:0)
不确定它是否仍然对您有用,但是我面临几乎相同的问题。我已经使用php -S localhost:5500
或VS代码扩展来启动php服务器,并尝试通过curl连接到同一主机,这几乎花费了无限时间而没有任何响应。解决方案很简单(如果您了解俄语,或者可以使用翻译器,则可以找到全文here)。
因此,从本文开始:
此脚本不适用于默认的WPN-XM v0.8.6设置,因为在后台仅侦听一个php -C gi进程,但是您的示例(至少)需要两个。发出curl请求的脚本已经在使用php -C gi,因此Nginx无法将其重定向到php -C gi。这意味着您将首先遇到带有加载指示器的空白页面,然后删除连接超时。 主要问题是php -C gi不会自动产生新进程(如果需要)。这里讨论了这个问题:https://github.com/WPN-XM/WPN-XM/issues/323
所以对我来说,解决方案是创建另一个具有不同端口(例如5500和5550)的php服务器,一切都开始工作。