PHP实现网络请求的方法总结
一、分析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.作者投稿可能会经我们编辑修改或补充。