在PHP中使用curl并不起作用

时间:2017-08-10 21:28:51

标签: php curl

我试图在Ubuntu 15.10上使用PHP中的curl获取HTML页面。

我的代码是以下..

<?php
    ini_set('display_errors', 1);

    $url = 'http://www.galliera.it/118';

    print "The url ... ".$url;
    echo '<br>';
    echo '<br>';

    //#Set CURL parameters ...
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_PROXY, '');
    $data = curl_exec($ch);
    curl_close($ch);

    print "Data ... ".$data;
    echo '<br>';
    echo '<br>';

?>

我执行代码时无法显示$data值,而在我的控制台中,返回的执行代码为200.

任何帮助/建议/示例?

1 个答案:

答案 0 :(得分:1)

您需要使用SSL设置curl

如果CURLOPT_SSL_VERIFYPEER为真(它应该是!),你需要告诉curl使用CURLOPT_CAINFO和CURLOPT_CAPATH(certificates)查找documentation的位置。

所有使用SSL的浏览器都必须拥有不同Certificate Authorities的本地公钥集合,以便他们可以建立对网站安全连接的信任链。此列表需要定期更新,因为证书过期并被替换,受到攻击,无法信任或添加新的列表。网站https://curl.haxx.se/有一个从Mozilla中提取的cacert.pem文件。

获取最新副本的推荐方法是定期从该网站下载,但不要经常下载其服务器。每个月应该足够了。

在Linux上,您可以使用crontab这样的条目:

# update CA cert store every month
0 1 1 * * curl --remote-name --time-cond /path/to/cacert.pem https://curl.haxx.se/ca/cacert.pem

url 302无论如何都会重定向到https版本,所以它应该是https并保存了网络往返。

$url = 'https://www.galliera.it/118';

$ch = curl_init();
$opt = array(
  CURLOPT_AUTOREFERER => true,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HEADER => false,
  CURLOPT_URL => $url,
  CURLOPT_SSL_VERIFYHOST => 2, //match common name in cert
  CURLOPT_SSL_VERIFYPEER => true,
  CURLOPT_ENCODING => '', //enable gzip
  CURLOPT_CAINFO => '/path/to/cacert.pem', //CA cert store !!!
  // if you are using linux and have openssl installed:
  CURLOPT_CAPATH => '/etc/ssl/certs',
  // you only need this when actually using a proxy
  // curl_setopt($ch, CURLOPT_PROXY, '');
);
curl_setopt_array($ch, $opt);
$data = curl_exec($ch);
curl_close($ch);

echo $data;

使用CURLOPT_PROXY指定代理ip:端口,但是如果你没有使用它,那就不要在那里。