PHP 传输会话curl函数的实例详解
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;
- } //phpfensi.com
- $res = $this->curl_multi_get_contents($urlarr,$param);
- //<a href="http://www.111cn.net/zhuanti/geshihua/" class="anchor" target="_blank">格式化</a>返回数据
- foreach($res as $key=>$val){
- $returndata[$key] = json_decode($val,true);
- }
- return $returndata;
- }