一、分析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获取
$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请求:
$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模块,这里有两种写法供大家参考:
<?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; } ?>
一个函数片时各种请求:
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
composer require guzzlehttp/guzzle
$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网络请求的资料请关注其它相关文章!
暂无评论内容