这里是文章模块栏目内容页
php的http客户端curl和files_get_contents和Guzzle\http介绍

CURL功能,在php语言开发中用于发起对http的 各种请求操作,例如get、post等。

针对比较严格的站点,例如启用了ssl 安全验证的https站点,需要设置开启更多的参数;

CURLOPT_SSL_VERIFYHOST的值

  • 设为0表示不检查证书

  • 设为1表示检查证书中是否有CN(common name)字段

  • 设为2表示在1的基础上校验当前的域名是否与CN匹配

libcurl早期版本中这个变量是boolean值,为true时作用同目前设置为2,后来出于调试需求,增加了仅校验是否有CN字段的选项,因此两个值true/false就不够用了,升级为0/1/2三个值。

再后来(libcurl_7.28.1之后的版本),这个调试选项由于经常被开发者用错,被去掉了,因此目前也不支持1了,只有0/2两种取值。

CURLOPT_SSL_VERIFYPEER 的值

false/true ; 表示是否开启验证https的ssl 证书检查。

当开启ssl证书检查,需要配置 证书和证书的ca 值等参数,如果是自己的站点,此参数可以设置为关闭 false。


下面是 用curl 发起 post 和get请求的函数示例;

   function request_post($url, $param='', $fouces_json=false){
            if (!$url) {
                return ['error'=>1,'msg'=>'url不能为空'];
            }
            if($fouces_json){
                $param = json_encode($param, JSON_UNESCAPED_UNICODE);
            }
            if(is_array($param)){
                $param = http_build_query($param, null, '&');
            }

            $ch = curl_init ();
            curl_setopt ( $ch, CURLOPT_URL, $url );
            curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );
            curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
            curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
            curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' );
            curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
            curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );
            curl_setopt ( $ch, CURLOPT_POSTFIELDS, $param);
            curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
            $response = curl_exec ( $ch );        
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            return array($httpCode, $response);

    }
    
    function request_get($url){        
            // curl模式
            if (function_exists('curl_init') && function_exists('curl_exec')) {
                $ch = curl_init($url);
                curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' );
                curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
                curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );
                if (substr($url, 0, 8) == "https://") {
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
                }
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $data = curl_exec($ch);
                curl_close($ch);
                return $data;
            }else{
                $data = @file_get_contents($url);
                if ($data !== FALSE) {
                    return $data;
                }
            }
            return FALSE;
    }

php为了简化get请求,提供了 file_get_contents 函数代替,很多时候可以直接用它来做get请求,因为它

不需要设置 额外参数,只要浏览器能打开的页面,它都能访问到。 

但是,如果对于 有的api接口,需要通过header 传递token或者其他更多head 参数,就不能通过此函数实现了。


另外,推荐 大家采用 GuzzleHttp\Client 这个库,它是一个 非常完善的http客户端。能实现所有的 http请求类型。

例如 文件上传,move、put、delete 、get、post等 请求。

关于它的文档: https://guzzle-cn.readthedocs.io/zh_CN/latest/


好了本文全部结束,感谢您的阅读,希望能帮助到您。