【问题标题】:curl not working on certain networkscurl 在某些网络上不起作用
【发布时间】:2014-09-16 20:48:36
【问题描述】:

我似乎遇到了一个奇怪的问题。我在笔记本电脑中有一个 PHP 脚本(在 wamp 下运行),它使用“curl”并且在工作中运行良好。但是当在家并连接到我的 ISP 时,同样的 脚本无法返回任何数据。甚至像下面这样的示例代码也失败了:

$ch = curl_init("http://www.yahoo.com/");
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
var_dump(curl_getinfo($ch));

curl_getinfo 不提供任何进一步调试的线索。 HTTP 代码为零。我需要添加任何标题>

我可以通过浏览器访问 example.com,所以我猜没有网络问题。 curl_err 和 curl_errno 为空。

<pre>
array (size=22)
  'url' => string 'http://www.example.com/' (length=23)
  'content_type' => null
  'http_code' => int 0
  'header_size' => int 0
  'request_size' => int 0
  'filetime' => int -1
  'ssl_verify_result' => int 0
  'redirect_count' => int 0
  'total_time' => float 0
  'namelookup_time' => float 0
  'connect_time' => float 0
  'pretransfer_time' => float 0
  'size_upload' => float 0
  'size_download' => float 0
  'speed_download' => float 0
  'speed_upload' => float 0
  'download_content_length' => float -1
  'upload_content_length' => float -1
  'starttransfer_time' => float 0
  'redirect_time' => float 0
  'certinfo' => 
    array (size=0)
      empty
  'redirect_url' => string '' (length=0)

</pre>
null
null

【问题讨论】:

  • curl_error()curl_errno() 请。
  • 如果您有服务器访问权限,请先尝试从服务器浏览 url。可能是服务器不允许连接到该站点。
  • 我会从一些 Web 调试器开始,例如 Fiddler(简单的 Web 调试器)或 WireShark(高级网络侦听器)。可能是一些网络问题 - 即远程服务器拒绝从您的 IP 访问。
  • 在问题中添加了更多信息。

标签: php curl


【解决方案1】:

经过深思熟虑,我认为这是你应该做的:

  1. 确保您可以从 PHP 连接到该站点:

    <?php $urlNoHttp = 'www.example.com'; // try 'example.com', too $hostIP = gethostbyname($urlNoHttp); var_dump($hostIP);

如果没有获取到IP你有连接问题,所以继续第2点。

否则 - 不是网络问题,而是 curl 设置本身 - 请尝试第 3 点及以下内容。

  1. 尝试从命令行 ping/wget'ting 您的目的地(ping www.example.com)。如果您收到响应 - 您的主机可以访问您的操作系统而不是 PHP,所以

  2. 如果您获得了 IP - 请尝试阅读有关 curl_setopt() int PHP docs 的信息。我将从设置正确的 HTTP 标头开始(例如内容类型、用户代理、请求的非空正文等)。另外,请尝试添加 curl_setopt($c, CURLOPT_FRESH_CONNECT, 1);,这会强制不使用 url 的缓存版本。

  3. 如果仍然无法正常工作 - 尝试混合一些代理选项,例如 curl_setopt($c, CURLOPT_HTTPPROXYTUNNEL, TRUE); 以强制“透明”代理(如果有的话)。

通常,您必须弄清楚切换网络环境时会发生什么变化。您必须知道是否涉及任何代理、一些奇怪的 NAT 系统或者您的路由器的防火墙可能有一些奇怪的设置,这些设置假定这种请求是不安全的并阻止它。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多