PHP实现网络请求的方法总结

吾爱主题 阅读:139 2022-11-11 16:12:00 评论:0

一、分析php发送网网络请求的方法

对于php发送网络请求,我们最常用的请求就是curl,有时我们也会用到file_get_contents函数发送网络请求,但file_get_contents只能完成一些间单的网络请求,稍复杂的就无法完成,例如文件上传,cookies,验证,表单提交等,用php的curl可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文件到FTP服务器等等,所以我们在开发中尽量用curl发网络请求,无论是简单还是复杂

二、file_get_contents发送网络请求示例

file_get_contents(path,include_path,context,start,max_length)

一般用file_get_contents或者fopen, file , readfile等函数读取url的时候 会创建一个$http_response_header变量保存HTTP响应的报头,使用fopen等函数打开的数据流信息可以用stream_get_meta_data获取

?
1 2 3 4 5 $html = file_get_contents ( 'http://www.baidu.com' ); print_r( $http_response_header ); $fp = fopen ( 'http://www.baidu.com' , 'r' ); print_r(stream_get_meta_data( $fp )); fclose( $fp );

摸拟post请求:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $url = 'http://192.168.1.1/test.php' ; $data = array (      'keyword' => 'test data' , ); $content = http_build_query( $data ); $content_length = strlen ( $content ); $options = array (      'http' => array (          'method' => 'POST' ,          'header' =>          "Content-type: application/x-www-form-urlencoded\r\n" .          "Content-length: $content_length\r\n" ,          'content' => $content      ) ); echo file_get_contents ( $url , false, stream_context_create( $options ));

三、php 用curl发送网络请求

curl可以支持https认证、http post、ftp上传、代理、cookies、简单口令认证等等功能,使用前需要先在你的PHP环境中安装和启用curl模块,这里有两种写法供大家参考:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 <?php function geturl( $url ){          $headerArray = array ( "Content-type:application/json;" , "Accept:application/json" );          $ch = curl_init();          curl_setopt( $ch , CURLOPT_URL, $url );          curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, FALSE);          curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, FALSE);          curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);          curl_setopt( $ch ,CURLOPT_HTTPHEADER, $headerArray );          $output = curl_exec( $ch );          curl_close( $ch );          $output = json_decode( $output ,true);          return $output ; }     function posturl( $url , $data ){          $data  = json_encode( $data );             $headerArray = array ( "Content-type:application/json;charset='utf-8'" , "Accept:application/json" );          $curl = curl_init();          curl_setopt( $curl , CURLOPT_URL, $url );          curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, FALSE);          curl_setopt( $curl , CURLOPT_SSL_VERIFYHOST,FALSE);          curl_setopt( $curl , CURLOPT_POST, 1);          curl_setopt( $curl , CURLOPT_POSTFIELDS, $data );          curl_setopt( $curl ,CURLOPT_HTTPHEADER, $headerArray );          curl_setopt( $curl , CURLOPT_RETURNTRANSFER, 1);          $output = curl_exec( $curl );          curl_close( $curl );          return json_decode( $output ,true); }     function puturl( $url , $data ){      $data = json_encode( $data );      $ch = curl_init(); //初始化CURL句柄      curl_setopt( $ch , CURLOPT_URL, $url ); //设置请求的URL      curl_setopt ( $ch , CURLOPT_HTTPHEADER, array ( 'Content-type:application/json' ));      curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出      curl_setopt( $ch , CURLOPT_CUSTOMREQUEST, "PUT" ); //设置请求方式      curl_setopt( $ch , CURLOPT_POSTFIELDS, $data ); //设置提交的字符串      $output = curl_exec( $ch );      curl_close( $ch );      return json_decode( $output ,true); }   function delurl( $url , $data ){      $data  = json_encode( $data );      $ch = curl_init();      curl_setopt ( $ch ,CURLOPT_URL, $put_url );      curl_setopt ( $ch , CURLOPT_HTTPHEADER, array ( 'Content-type:application/json' ));      curl_setopt ( $ch , CURLOPT_RETURNTRANSFER, 1);      curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST, "DELETE" );        curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );      $output = curl_exec( $ch );      curl_close( $ch );      $output = json_decode( $output ,true); }   function patchurl( $url , $data ){      $data  = json_encode( $data );      $ch = curl_init();      curl_setopt ( $ch ,CURLOPT_URL, $url );      curl_setopt ( $ch , CURLOPT_HTTPHEADER, array ( 'Content-type:application/json' ));      curl_setopt ( $ch , CURLOPT_RETURNTRANSFER, 1);      curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST, "PATCH" );       curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );     //20170611修改接口,用/id的方式传递,直接写在url中了      $output = curl_exec( $ch );      curl_close( $ch );      $output = json_decode( $output );      return $output ; } ?>

一个函数片时各种请求:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 function sendCurl( $url , $data = null, $method = 'POST' ) {      $method = strtoupper ( $method );      $start_wdmcurl_time = microtime(true);        $header = array ( ' application/x-www-form-urlencoded' );      $ch = curl_init();      curl_setopt( $ch , CURLOPT_URL, $url );      curl_setopt( $ch , CURLOPT_FAILONERROR, false);      // https 请求      if ( strlen ( $url ) > 5 && strtolower ( substr ( $url , 0, 5)) == "https" )      {          curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false);          curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, false);      }      if ( $method == 'GET' ){          if ( $data && is_array ( $data ) && count ( $data )>0 ){              $url .= "?" .http_build_query( $data );          }          curl_setopt( $ch , CURLOPT_URL, $url );      } elseif ( $method == 'POST' ){          curl_setopt( $ch , CURLOPT_POST, 1);          curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );          if ( is_array ( $data ) && count ( $data )>0)          {              curl_setopt( $ch , CURLOPT_POST, true);              $isPostMultipart = false;              foreach ( $data as $k => $v )              {                  if ( '@' == substr ( $v , 0, 1))                  {                      $isPostMultipart = true;                      break ;                  }              }              unset( $k , $v );              if ( $isPostMultipart ) {                  curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );              } else {                  curl_setopt( $ch , CURLOPT_POSTFIELDS, http_build_query( $data ));              }          }      } elseif (in_array( $method ,[ 'PUT' , 'DELETE' , 'PATCH' ])){          curl_setopt( $ch , CURLOPT_CUSTOMREQUEST, $method );          curl_setopt( $ch , CURLOPT_POSTFIELDS, $data );      }      curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);      curl_setopt( $ch ,CURLOPT_HTTPHEADER, $header );      $reponse = curl_exec( $ch );      curl_close( $ch );      return $reponse ; }

四、使用php composer的扩展guzzlehttp

?
1 composer require guzzlehttp/guzzle
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $client = new \GuzzleHttp\Client(); $response = $client ->request( 'GET' , 'https://api.github.com/repos/guzzle/guzzle' );   echo $response ->getStatusCode(); // 200 echo $response ->getHeaderLine( 'content-type' ); // 'application/json; charset=utf8' echo $response ->getBody(); // '{"id": 1420053, "name": "guzzle", ...}'   // Send an asynchronous request. $request = new \GuzzleHttp\Psr7\Request( 'GET' , 'http://httpbin.org' ); $promise = $client ->sendAsync( $request )->then( function ( $response ) {      echo 'I completed! ' . $response ->getBody(); });   $promise ->wait();

日常开发中我们尽量用方法三,自定义用curl处理网络请求,或用composer的guzzlehttp扩展库,有起来也很方便。

以上就是PHP实现网络请求的方法总结的详细内容,更多关于PHP网络请求的资料请关注服务器之家其它相关文章!

原文链接:https://mp.weixin.qq.com/s/IDRLghqmRW8avz7IJdqzLA

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容