PHP 传输会话curl函数的实例详解


Posted in PHP onSeptember 12, 2017

PHP 传输会话curl函数的实例详解

前言:

 接手公司项目PC端负责人的重担,责任担当重大;从需求分析,画流程图,建表,编码,测试修bug,上线维护等我一个光杆司令一人完成(当然还有一个技术不错的前端配合,感谢主管的帮助),虽然累点加班多点但感觉还行吧,公司都是一个鸟样。

  闲话不多说了,因为项目中经常需要调取java那边的接口,既然涉及到请求接口那就有了http的请求方式,PHP常见的是GET/POST两种当然还有其他的比如put等,java那边经常用到GET/POST/PUT/DELETE等方式,请求接口当然要用到curl的相关函数了,都是看文档调试的希望大家都看文档,下面是我封装好的相关函数等(大概总结下,已调通):

示例代码:

private $serverhost = "https://demo.xxx.cn"; //测试
    /**
     * 请求接口封装  get/post/put/delete等
     * access public
     * @param string $url 接口地址
     * @param string $params 参数
     * @param string $type 类型 get/post/put/delete
     * @return bool/array
     */
     public function getcurldata($url,$params,$type="get"){
        $url = $this->serverhost.$url;
 
        $response = array();
        if($type == 'get'){ //get请求
          //请求头可以加其他设置
          $headers = array(
              'Content-type: application/json;charset=UTF-8',
          );
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          $response = curl_exec($ch);
 
       }elseif ($type == 'post'){  //post请求
 
         $headers = array(
            'Content-type: application/json;charset=UTF-8',
         );
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
         curl_setopt($ch, CURLOPT_POST, true);  //注意这几行
         curl_setopt($ch, CURLOPT_POSTFIELDS, $params); //注意这几行
         //curl_setopt($ch, CURLOPT_HEADER, true);
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
         $response = curl_exec($ch);
 
       }elseif ($type == 'put'){ //put请求
 
          $headers = array(
               'Content-type: application/json;charset=UTF-8',
          );
 
          $ch = curl_init();
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
          curl_setopt($ch, CURLOPT_PUT, true); //注意这几行
          curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
          //curl_setopt($ch, CURLOPT_HEADER, true);
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
          $response = curl_exec($ch);
       }
 
       return $response;
    } 
 //如何调用上面代码
   //get方式
   /**
    * 查询我创建过的班级
    * @param string $url 接口地址
    * @param string $params 参数
    * @param string $type 类型 get
    * @return array
   */
    public function mycreateclass($userid){
 
       $url = "/xxx/xxxx/xxxx/".$userid; //请求地址拼接
       $response = $this->getcurldata($url,array(),"get");
       $createdclass = json_decode($response, true); //返回json格式数据
 
       return $createdclass;
    }
    /** post方式请求
     * 用户登录判断
     * access public
     * @param string $username 用户名
     * @param string $password 密码
     * @return bool
    */
    public function getlogin($username,$password)
    {
       //要post的数据
       $params = array(
          "username"   => $username,
          "password"   => $password
       );
      $params = json_encode($params, 64|256);
      $uri = "/xxx/xxx/login";
      $response = $this->getcurldata($uri,$params,"post");
      $result = json_decode($response, true);
 
      return $result ;
    }
     
     /*身份转换--put 请求
      */
     public function changeuserole($token){
         //要put的数据
        $params = array();
        $params = json_encode($params, 64|256);
 
        $uri = "/xxx/xxx/xxx/".$token."/";
        $response = $this->getcurldata($uri,$params,"put");
        $result = json_decode($response, true);
 
        //dump($result);die;
 
        return $result;
     }
 //还有一个delete方式 大家自己参考文档调试下吧
上面3个请求方式都是单次请求(即请求一次)***************
PHP自带函数curl_multi_get_contents函数(thinkphp自带此函数,可以微调下):
     /** 
      * 批量发起请求 已调通
      * curl multi POST数据
      * */
     public function curl_multi_get_contents($url=array(), $param = array(), $timeout=1000){
         $userAgent = 'Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1)';
         $headers = array(
            'Content-type: application/json;charset=UTF-8',
         );
         $curl_array=array();
         $mh = curl_multi_init();
         foreach($url as $uk=>$uv){
            $curl_array[$uk] = curl_init();
         }
         unset($uk,$uv);
         foreach($url as $uk=>$uv) {
             $options = array(
                CURLOPT_URL   => $uv,
                CURLOPT_TIMEOUT => $timeout,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_DNS_CACHE_TIMEOUT => 86400,
                CURLOPT_DNS_USE_GLOBAL_CACHE  => true,
                CURLOPT_SSL_VERIFYPEER => 0,
                CURLOPT_HEADER => false,
                CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)',
                CURLOPT_HTTPHEADER => $headers,
             );
         if (isset($param[$uk])) {
             foreach ($param[$uk] as $_k => $_v) {
                //$options[$_k] = $_v;
                $optionsparam[$_k] = $_v;
                $options[CURLOPT_POSTFIELDS] = json_encode($optionsparam, 64|256);
             }
          }
 
         curl_setopt_array($curl_array[$uk], $options);
         curl_multi_add_handle($mh, $curl_array[$uk]);
         unset($options);
      }
      unset($uk,$uv);
      $running = NULL;
      do {
           curl_multi_exec($mh,$running);
       } while($running > 0);
 
       $res = array();
       foreach($url as $uk=>$uv){
            $res[$uk] = curl_multi_getcontent($curl_array[$uk]);
       }
       unset($uk,$uv);
       foreach($url as $uk=>$uv){
           curl_multi_remove_handle($mh, $curl_array[$uk]);
       }
      unset($url,$curl_array,$uk,$uv);
      curl_multi_close($mh);
      return $res;
   }
 //如何调用--批量发起请求
    //批量请求加入班级
    public function batchjoinclass($token,$batchjoinclass){
        $urlarr = $param = $returndata = array();
 
        $param = $batchjoinclass; //二维数组 格式如下
 
        /*
         $param[1]['name'] = '班级新1';
         $param[1]['iamge'] = 'xxx11.png';
         $param[1]['iamgeType'] = 'CUSTOM';
         $param[2]['name'] = '班级新2';
         $param[2]['iamge'] = 'xxx.png';
         $param[2]['iamgeType'] = 'CUSTOM';
       */
 
       //获取请求url
       foreach($batchjoinclass as $key=>$val){
           $urlarr[$key] = $this->serverhost."/xxx/xxxx/xxxx/".$token;
        }
 
        $res = $this->curl_multi_get_contents($urlarr,$param);
 
        //格式化返回数据
        foreach($res as $key=>$val){
            $returndata[$key] = json_decode($val,true);
        }
 
        return $returndata;
    }

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
用PHP制作静态网站的模板框架(四)
Oct 09 PHP
深入了解php4(2)--重访过去
Oct 09 PHP
function.inc.php超越php
Dec 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
PHP面向对象精要总结
Nov 07 PHP
浅谈php自定义错误日志
Feb 13 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 #PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 #PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 #PHP
php mysql PDO 查询操作的实例详解
Sep 23 #PHP
PHP实现权限管理功能示例
Sep 22 #PHP
php生成毫秒时间戳的实例讲解
Sep 22 #PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 #PHP
You might like
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
深入PHP FTP类的详解
2013/06/13 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python如何将多个PDF进行合并
2019/08/13 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
Python3实现飞机大战游戏
2020/04/24 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
中专生求职自荐信范文
2013/12/22 职场文书
事业单位辞职信范文
2014/01/19 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
水电工岗位职责
2014/02/12 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
村干部培训方案
2014/05/02 职场文书
妇女干部培训方案
2014/05/12 职场文书
单位员工收入证明样本
2014/10/09 职场文书
年会主持人开场白台词
2015/05/29 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js