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入门小知识
Mar 24 PHP
PHP 上传文件大小限制
Jul 05 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
php过滤敏感词的示例
Mar 31 PHP
php异常处理方法实例汇总
Jun 24 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 29 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Python函数生成器原理及使用详解
2020/03/12 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
如何选择使用结构还是类
2014/05/30 面试题
五一服装活动方案
2014/01/11 职场文书
会计核算科岗位职责
2014/03/19 职场文书
企业趣味活动方案
2014/08/21 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android