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比较多维数组中值的大小排序实现代码
Sep 08 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php中序列化与反序列化详解
Feb 13 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
document.compatMode介绍
2009/05/21 Javascript
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
django中间键重定向实例方法
2019/11/10 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
Linux的主要特性
2014/10/06 面试题
心得体会开头
2014/01/01 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
抽奖活动主持词
2014/03/31 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
质量负责人岗位职责
2015/02/15 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Golang 实现WebSockets
2022/04/24 Golang