当前位置:   article > 正文

php之curl实现http与https请求的方法_php curl ssl

php curl ssl

这篇文章主要介绍了php之curl实现http与https请求的方法,分别讲述了PHP访问http网页与访问https网页的实例,以及相关的注意事项,需要的朋友可以参考下。

 本文实例讲述了php之curl实现http与https请求的方法,分享给大家供大家参考。具体如下:
通常来说,php的curl函数组可以帮助我们把机器伪装成人的行为来抓取网站,下面来分享两个例子,一个是访问http网页,一个访问https网页,一起来看一下。
每次要使用curl的时候,总要查一堆资料。
现在将常用的几句保存下来,省的每次都去谷歌。

常规curl请求:

  1. $url = 'http://www.jb51.net';
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, $url);
  4. curl_setopt($curl, CURLOPT_HEADER, 1);
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. $data = curl_exec($curl);
  7. curl_close($curl);
  8. var_dump($data);

使用curl请求HTTPS:

  1. $url = 'https://www.jb51.net';
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, $url);
  4. curl_setopt($curl, CURLOPT_HEADER, 1);
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. // 设置头信息(当用IP直接访问时,加这个如:https://baibu.com -> 220.15.23.5
  7. // curl_setopt($ci, CURLOPT_HTTPHEADER, array('Host:baibu.com'));
  8. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //这个是重点,规避ssl的证书检查。
  9. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 跳过host验证
  10. $data = curl_exec($curl);
  11. curl_close($curl);
  12. var_dump($data);

注意

当请求https的数据时,会要求证书,这时候,加上下面这两个参数,规避ssl的证书检查
复制代码 代码如下:

  1. // https请求 不验证证书和hosts
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  3. // 从证书中检查SSL加密算法是否存在(默认不需要验证)
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl https请求代码 

  1. <?php
  2. /** curl 获取 https 请求
  3. * @param String $url 请求的url
  4. * @param Array $data 要發送的數據
  5. * @param Array $header 请求时发送的header
  6. * @param int $timeout 超时时间,默认30s
  7. * @param bool $debug 是否打印错误信息,默认false
  8. */
  9. function curl_https($url, $data=array(), $header=array(), $timeout=30, $debug=false){
  10. $ch = curl_init();
  11. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
  12. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
  13. curl_setopt($ch, CURLOPT_URL, $url);
  14. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  15. curl_setopt($ch, CURLOPT_POST, true);
  16. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  17. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  18. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  19. $response = curl_exec($ch);
  20. if($error=curl_error($ch)){
  21. die($error);
  22. }
  23. // 打印错误信息
  24. if($debug)
  25. {
  26. echo '=====info====='."\r\n";
  27. print_r( curl_getinfo($ch) );
  28. echo '=====error====='."\r\n";
  29. print_r( curl_error($ch) );
  30. echo '=====$response====='."\r\n";
  31. print_r( $response );
  32. }
  33. curl_close($ch);
  34. return $response;
  35. }
  36. // 调用
  37. $url = 'https://www.example.com/api/message.php';
  38. $data = array('name'=>'fdipzone');
  39. $header = array();
  40. $response = curl_https($url, $data, $header, 5);
  41. echo $response;
  42. ?>

baidu域名解析后https请求示例

 

为什么要解析域名后再请求呢?因为用curl请求网络,如果直接用域名baidu.com 这样会在请求中解析域名耗时很长,测试了几次有10几秒吧,如果直接用解析后的IP请求,则速度会大大提升。

请看下面的示例:

  1. // $url = "https://www.baidu.com";
  2. $url = "https://123.125.114.144";
  3. $curl = curl_init();
  4. curl_setopt($curl, CURLOPT_URL, $url);
  5. curl_setopt($curl, CURLOPT_HEADER, 1);
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  7. // 增加请求头文件
  8. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host:baidu.com'));
  9. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
  10. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  11. $data = curl_exec($curl);
  12. // 打印获取curl请求信息
  13. // $curl_info = curl_getinfo( $curl );
  14. // print_r($curl_info);
  15. // 打印错误信息
  16. // curl_error( $curl);
  17. curl_close($curl);
  18. var_dump($data);

更加完美的封装:

加载证书文件:

  1. /**
  2. * curl POST
  3. *
  4. * @param string url
  5. * @param array 数据
  6. * @param int 请求超时时间
  7. * @param bool HTTPS时是否进行严格认证
  8. * @return string
  9. */
  10. function curlPost($url, $data = array(), $timeout = 30, $CA = true){
  11. $cacert = getcwd() . '/cacert.pem'; //CA根证书
  12. $SSL = substr($url, 0, 8) == "https://" ? true : false;
  13. $ch = curl_init();
  14. curl_setopt($ch, CURLOPT_URL, $url);
  15. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  16. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2);
  17. if ($SSL && $CA) {
  18. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
  19. curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根证书(用来验证的网站证书是否是CA颁布)
  20. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
  21. } else if ($SSL && !$CA) {
  22. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
  23. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名
  24. }
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  26. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data数据过长问题
  27. curl_setopt($ch, CURLOPT_POST, true);
  28. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  29. //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode
  30. $ret = curl_exec($ch);
  31. //var_dump(curl_error($ch)); //查看报错信息
  32. curl_close($ch);
  33. return $ret;
  34. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/270181
推荐阅读
相关标签
  

闽ICP备14008679号