php发送get,post请求学习

本文深入探讨了PHP中的输入流概念及其在发送HTTP请求中的应用,通过实例展示了如何使用`file_get_contents`、`fopen`、`http_build_query`等函数进行GET和POST请求,并解释了如何使用curl库实现更高效的数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习http://blog.youkuaiyun.com/haha00217/article/details/7969504

在看thinkphp代码看到php://input不知道是什么东西.......搜了下,说是输入流,感觉好高端.....

再看下讲解的例子,涉及到了php发送http请求的知识,以前没用过啊,赶紧看看~~~~看的上面网址大神的微博,本来直接转载就行了,但还是想自己记录下

一,用file_get_contents来发送get以get方式接受

<span style="font-size:18px;"><span style="font-size:18px;"><?php
$url='http://localhost/mytest/tset.php';
$html=file_get_contents($url);
var_dump($html);
?></span></span>

二, 用fopen打开url, 以get方式获取内容

<span style="font-size:18px;"><span style="font-size:18px;"><?php
$url='http://localhost/mytest/tset.php';
//php手册上说是把资源绑定到一个流上面,成功之后返回文件指针资源
$html=fopen($url, 'r');
//这个函数会返回当前协议文件中取得一些信息(php手册上这样说,我自己把这个理解成取得当前请求的一些信息,比如请求是否成功,服务器版本啊之类的信息)
var_dump(stream_get_meta_data($html));
$str='';
//因为$html是一个指针资源,不能直接输出,所以要使用下面的循环来取出,类似于从数据库取出资源
//循环,没到文件结尾就循环feof检测是否到达文件指针结尾
while (!feof($html)) {
    //从文件指针中读取后面设置的字节
    $str.=fgets($html,1024);
}
var_dump($str);
//关闭已经打开的文件指针,免得占用资源,感觉和mysql连接一样,不用的时候要关掉~~~
fclose($html);
?></span></span>

三,用file_get_contents函数,以post方式获取

<span style="font-size:18px;"><span style="font-size:18px;"><?php
$url='http://localhost/mytest/tset.php';
//要传递的参数
$data=array('boo'=>'bar');
//这个函数是可以把数组转换成boo=bar形式,现在参数很少所以没什么,但是参数多的话用这个函数很方便(应该是这个作用吧~~)
$data=http_build_query($data);
//http请求的参数,注意header项的值要用双引号,不然\r\n不会被解析成换行符,会影响传值,别的影响没遇到,不知道
$options=array(
    'http'=>array(
            'method'=>'POST',
            'header'=>"Content-type: application/x-www-form-urlencoded\r\n"."Content-Length: " . strlen($data) . "\r\n",
            'content' => $data
    )
);
//创建一个上下文资源流
$content=stream_context_create($options);
//发送请求第一个参数是文件位置,改成false和true没什么影响啊,第三个就是http请求头以及一些设置选项了
$html=file_get_contents($url,true,$content);
var_dump($html);
?></span></span>
四,用fsockopen函数

老是报错........先不管这个了...

弄好了

post

<span style="font-size:18px;"><pre name="code" class="php"><?php
//@file phpinput_post.php
//要传递的参数
$http_entity_body = 'n=' . urldecode('perfgeeks') . '&p=' . urldecode('7788');
//应该是请求发送给接受者的实体正文类型
$http_entity_type = 'application/x-www-form-urlencoded';
//正文的长度
$http_entity_length = strlen($http_entity_body);
$host = '127.0.0.1';
$port = 80;
$path = 'http://localhost/mytest/tset.php';
//依次是,主机,端口,错误号,错误信息,过期时间,这步好像没发请求
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
    //写协议内容。。。页面地址
fputs($fp, "POST {$path} HTTP/1.1\r\n");
//主机
fputs($fp, "Host: {$host}\r\n");
//请求正文类型
fputs($fp, "Content-Type: {$http_entity_type}\r\n");
//正文长度
fputs($fp, "Content-Length: {$http_entity_length}\r\n");
//这个不知道....
fputs($fp, "Connection: close\r\n\r\n");
//发送的数据
fputs($fp, $http_entity_body . "\r\n\r\n");
$d='';
//取出数据
while (!feof($fp)) {
$d .= fgets($fp, 4096);
}
//关闭连接
fclose($fp);
//直接输出会输出http协议信息,所以做一些处理
//先从http协议中计算出正文的长度
preg_match('/Content-Length: (\d+)/', $d, $maths );
//var_dump($maths[1]);
//用字符串的总长度减去正文的长度就是http协议的长度了,再用substr截取就ok了
$d=substr($d,strlen($d)-(int)$maths[1]);
//输出请求结果
echo $d;
}
?></span>

get

<span style="font-size:18px;"><?php
//@file phpinput_post.php
//要传递的参数
$http_entity_body = 'n=' . urldecode('perfgeeks') . '&p=' . urldecode('7788');
$host = '127.0.0.1';
$port = 80;
$path = 'http://localhost/mytest/tset.php';
//依次是,主机,端口,错误号,错误信息,过期时间,这步好像没发请求
$fp = fsockopen($host, $port, $error_no, $error_desc, 10);
if ($fp) {
    //写协议内容。。。页面地址
fputs($fp, "GET {$path}?{$http_entity_body} HTTP/1.1\r\n");
//主机
fputs($fp, "Host: {$host}\r\n");
//这个不知道....
fputs($fp, "Connection: close\r\n\r\n");
$d='';
//取出数据
while (!feof($fp)) {
$d .= fgets($fp, 4096);
}
//关闭连接
fclose($fp);
//直接输出会输出http协议信息,所以做一些处理
//先从http协议中计算出正文的长度
preg_match('/Content-Length: (\d+)/', $d, $maths );
//var_dump($maths[1]);
//用字符串的总长度减去正文的长度就是http协议的长度了,再用substr截取就ok了
//$d=substr($d,strlen($d)-(int)$maths[1]);
//输出请求结果
echo $d;
}
?></span>



五,使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展

<span style="font-size:18px;"><span style="font-size:18px;"><?php
//初始化一个curl回话(感觉就是实例化了一个对象。。)
$cu=curl_init();
$timeout=30;
//设置一个curl回话的传输选项,有很多选项可以设置,这里就不一一设置了
curl_setopt($cu, CURLOPT_URL, 'http://localhost/mytest/tset.php');
//设置值为"1"成功会返回请求页面的内容,设置为"0"成功会返回1
curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cu, CURLOPT_CONNECTTIMEOUT, $timeout);
$res=curl_exec($cu);
echo $res;
?>

</span></span>
curl好简单.....而且好像性能也是最强的~~~






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值