【问题标题】:php curl headers do not return from website?php curl标头不从网站返回?
【发布时间】:2019-04-07 04:51:24
【问题描述】:

我使用此命令从该特定页面获取标题。

curl -I https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324

我从终端运行上述命令,我得到了这些结果...

HTTP/2 200
content-type: text/html; charset=UTF-8
pragma: public
last-modified: Fri, 02 Nov 2018 18:15:13 GMT
gbcdnlang: en
access-control-allow-origin: *
access-control-allow-methods: GET, POST
ng-cache: HIT
x-edgeconnect-midmile-rtt: 36
x-edgeconnect-origin-mex-latency: 137
cache-control: public, max-age=60
expires: Fri, 02 Nov 2018 23:39:15 GMT
date: Fri, 02 Nov 2018 23:38:15 GMT
set-cookie: ORIGINDC=3;Domain=.gearbest.com;Path=/
set-cookie: ORIGINDCPC=3;Domain=.gearbest.com;Path=/
set-cookie: AKAM_CLIENTID=d51abedb38c60f8a5217ae15808769fc; expires=Mon, 31-Dec-2038 23:59:59 GMT; path=/; domain=.gearbest.com
vary: User-Agent

到目前为止一切顺利。但是当我尝试使用下面的代码在 php 中实现时,我得到“URL 不存在”!我究竟做错了什么?任何帮助表示赞赏。

  $url1 = "https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324";
  $curl1 = curl_init($url1);
  curl_setopt($curl1, CURLOPT_NOBODY, true);
  curl_setopt($curl1, CURLOPT_CONNECTTIMEOUT, 0);
  curl_setopt($curl1, CURLOPT_TIMEOUT, 5); //timeout in seconds


  $result1 = curl_exec($curl1);

  if ($result1 !== false)
  {
    $statusCode1 = curl_getinfo($curl1, CURLINFO_HTTP_CODE);
    if ($statusCode1 == 404)
    {
      echo "URL Not Exists";
    }
    else
    {
       echo "URL Exists";
    }
  }
  else
  {
    echo "URL not Exists";
  }

【问题讨论】:

  • 在终端上输入$ php -i | grep "SSL Version"会得到什么?
  • 你好在终端我得到 SSL 版本 => LibreSSL/2.0.20
  • 问题在于 LibreSSL。看我的回答...

标签: php php-curl


【解决方案1】:

首先,您发布的代码是有效的。你不需要改变它。

如果你只是用 ex 试试。 https://www.google.com 有效。

问题是您的 PHP 版本使用 LibreSSL 进行 php-curl HTTPS 连接。

我在 macOS 上遇到同样的问题,我的 PHP 版本使用 OpenTransport

您要连接的网站需要以 LibreSSL 无法处理的方式建立 SSL 连接。

您需要编译/安装 OpenSSL 并在已编译为用于 php-curl 的 PHP 解释器上运行您的代码。


更新:

当您在 macOS 上时,您可以从源代码编译 PHP。 谷歌搜索macos compile php from source 将返回一个“食谱”列表。

如果您使用 brew 编译 PHP(以及所有“Web 应用程序堆栈”),您可以看看这里:

osx 10.10 Curl POST to HTTPS url gives SSLRead() error

问题(和答案)还解决了与您问题中的问题类似的问题。

【讨论】:

  • 我也在 MacOS 上。所以我必须安装 OpenSSL,但我必须找到一个教程如何完成其​​余的过程......
  • @stefanosn 查看我的答案的更新。希望有帮助!
  • 感谢您的指导,我很感激!
【解决方案2】:

尝试添加 CURLOPT_SSL_VERIFYPEER 选项,它通过 SSl 连接但检查证书,如下所示:

<?PHP
  $handle=curl_init('https://www.google.com');
  curl_setopt($handle, CURLOPT_VERBOSE, true);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
  $content = curl_exec($handle);
  echo $content;
?>

【讨论】:

【解决方案3】:

我认为这不是你的问题。我认为当通过 PHP 请求某些内容时,它们会阻止某些内容。当您使用file_get_contents 时,您会得到以下输出。

Warning: file_get_contents(): SSL: Operation timed out in /test.php on line 2
Warning: file_get_contents(https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324): failed to open stream: HTTP request failed!  in /test.php on line 2

当您在脚本中使用以下网址时,它可以正常工作 (https://www.test.de)。

我已经用你的脚本做了一些其他的测试,但我每次都得到一个结果和你的例外结果。

【讨论】:

  • Error:LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 60 ...我只是好奇这怎么可能!一定有办法!
猜你喜欢
  • 2012-03-23
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多