【问题标题】:PHP Guzzle 5: Cannot handle URL with PORT number in itPHP Guzzle 5:无法处理带有端口号的 URL
【发布时间】:2015-05-15 01:36:30
【问题描述】:

我正在使用最新版本的 guzzle。

(from composer.json)
"guzzlehttp/guzzle": "~5" 

(from composer.lock)
"name": "guzzlehttp/guzzle",
"version": "5.2.0",

当我尝试使用包含端口号的 URL 请求(GET 或 POST)时:

$response = $client->get('http://www.hostdnshere.com:8888', array());

我收到以下错误:

string(68) "cURL error 7: Failed to connect to 000.000.000.000: Permission denied"

当我做同样的事情但省略端口时:

$response = $client->get('http://www.hostdnshere.com', array());

请求成功,没有问题。我已经搜索了文档并在网上搜索过了,但由于无法包含它,所以无法找到如何为主机设置端口。

此外,我已经在发送请求的服务器表单上使用 cURL 对其进行了测试,无论有无 PORT,无论如何都像一个魅力,所以我知道这不是服务器、DNS、代理的问题,或端口。

【问题讨论】:

  • 在 GitHub 上看到你的问题,很遗憾 I can't reproduce what you're describing
  • 给出具体的主机名,这似乎不是guzzle 问题,而是指定的端口无效,或授权保护区域
  • 是的,我复制了你的测试,它工作正常。我正在从 Laravel 4.2 应用程序中的 PHP 类运行 Guzzle,但出现错误。当我检查 composer.json 文件时,Guzzle 仅在其中列出一次,如上所示,但是当我查看 composer.lock 文件时,我看到 guzzle/guzzle 以及 guzzlehttp/guzzle 由 composer 安装,即使我删除供应商 bin 和 lock 文件并进行干净的作曲家安装。所以其他一些包依赖于 Guzzle,但由于两者有不同的命名空间,我认为它们不会相互冲突。
  • 而且我在 PHP 类中使用 GuzzleHttp\Client 完全限定了最新版本;使用 GuzzleHttp\Exception\RequestException;
  • 以及在创建时完全限定它以确保使用最新的 Guzzle 来实例化对象。 $client = new GuzzleHttp\Client();

标签: php url curl port guzzle


【解决方案1】:

对于那些因为他们的头撞到墙上的人

"cURL error 7: Failed to connect to 000.000.000.000: Permission denied"

错误,这一切都归结为“SELINUX”。没错,用任何编程语言编写的任何 cURL 包装器都可能受到以下事实的影响:当“SELINUX”设置为“强制”时,针对其中包含非标准 PORT 的 URL 执行 cURL 时会出现问题(即my.domain.com:8888)。

建议仅用于本地开发,如果您希望在 URL 中使用非标准端口,请将“SELINUX”设置为“禁用”。生产中的正确解决方案是使用没有 PORT 的干净 URL,以便启用“SELINUX”。

打开:

nano /etc/selinux/config

定位:

SELINUX=enforcing

变化:

SELINUX=disabled

那些使用 CentOS 的人很可能会遇到这个问题,因为“SELINUX”默认设置为“强制”。

【讨论】:

  • 谢谢!请记住在进行更改后重新启动。
猜你喜欢
  • 2012-12-18
  • 2017-04-08
  • 2016-09-13
  • 1970-01-01
  • 2018-02-21
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多