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;
- } //Vevb.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;
- }
新聞熱點
疑難解答