【问题标题】:file_get_contents and curl doesn't work, blocked tcp port problemfile_get_contents 和 curl 不起作用,阻塞 tcp 端口问题
【发布时间】:2011-10-01 07:45:51
【问题描述】:

我正在尝试编写一个 Joomla 模块,它将解析来自 springer api 的 json 数据。我对“file_get_contents”方法和其他替代方法有疑问。我的问题是:

Warning: file_get_contents(http://www.example.com) [function.file-get-contents]: failed to open stream: A socket operation was attempted to an unreachable network. in C:\wamp\www\modules\mod_springer\mod_springer.php on line 72

经过一番搜索,我发现可能是因为我公司的防火墙。有什么办法可以解决这个问题,比如更改我正在使用的端口或使用其他方法,还是我被困在这里?

注意:allow_url_fopen 已启用。我正在使用 wamp。

【问题讨论】:

  • 您是否使用代理连接互联网?
  • 您真的像警告所说的那样使用了 xxx.com 还是 api.springer.com?如果您使用前者,那么这个网站很可能被您的公司列入黑名单^^
  • @Gedrox 不,我没有使用代理 @jurgen 不,我使用 api.springer.com 和他们提供的密钥 :)
  • 如果您能够在浏览器中打开地址,您应该也可以通过传递浏览器发送的相同请求标头来连接 PHP。
  • @gedrox:无关紧要。服务器与运行浏览器的任何机器不同。说我家门没锁与工作门的状态无关。

标签: php json firewall file-get-contents


【解决方案1】:

如果您能说服当权者允许您通过防火墙访问您希望连接的远程 API,那么您就不会陷入困境。只要您有正当理由并且可以在狭窄范围内(一个特定的 IP 和端口)提供防火墙访问权限,我不明白为什么您在获得此访问权限时会遇到问题。

【讨论】:

  • 他们说他们不能解除对 25 端口的阻塞,但如果我有机会用任何其他端口解决这个问题,我猜他们不会那么严格。我是否让 file_get_contents 与其他端口一起使用?
  • @Ismail:只需将端口放入 url:http://example.com:XXX/... 其中 XXX 是端口号。
  • 端口 25 不应该用于 HTTP 请求...应该用于 SMTP。你确定你有这个权利吗?
  • @Ismail AJ 是 100% 正确的,HTTP 请求通常会通过端口 80 或作为替代的 8080。您为什么还要尝试使用端口 25?
  • @Marc $arr = json_decode(file_get_contents($json_feed_url),true); var_dump($arr); 这也不行。
【解决方案2】:
  1. here下载cacert.pem文件
  2. cacert.pem 文件复制到例如c:/wamp/bin/php/extras/ssl 文件夹
  3. php.pni curl.cainfo ="c:/wamp/bin/php/extras/ssl/cacert.pem" and save 中写入或取消注释
  4. 重启 Wamp/Xampp 服务器
  5. 完成

【讨论】:

    【解决方案3】:

    有可能(可能)克服 cURL 代理处理的问题,例如:

    curl_setopt($ch, CURLOPT_PROXY, "http://xxx.xxx.xxx.xxx:8080");
    curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
    curl_setopt ($ch, CURLOPT_PROXYUSERPWD, "xxx:xxx"); 
    

    这取决于一些事情,例如您拥有的权限,如果它只是一个被阻止的端口,或者它是否是访问控制。

    【讨论】:

    • 感谢您的努力,但仍然无效,回复为“假”。
    • 我没有直接使用 25 端口,实际上我没有在代码中指向任何端口。 IT 人员说我可以使用 80 或 8080。下面的代码仍然无法正常工作。有什么建议? $json_feed_url ='http://api.springer.com:80/metadata/json?q=avionics&api_key=xxxxxxxxxxxxxxxx'; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_PROXY, $json_feed_url); curl_setopt($ch, CURLOPT_PROXYPORT, 80); curl_setopt($ch, CURLOPT_PROXYUSERPWD, "xxx:xxx"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($ch); curl_close($ch); $arr = json_decode($json); var_dump($arr);
    • 您是否尝试过从 $json_feed_url 中的 URL 字符串中删除端口规范?您可能还想尝试使用 curl 的 0 和 1 值而不是 true 和 false,我不是 100% 确定为什么,但我发现有时这对我有用
    • 那么您可以使用哪些端口?
    猜你喜欢
    • 2012-07-10
    • 2014-01-19
    • 2017-08-02
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2011-03-03
    相关资源
    最近更新 更多