php发送get,post

转载自:http://blog.csdn.net/haha00217/article/details/7969504

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

<?php
$url='http://localhost/mytest/tset.php';
$html=file_get_contents($url);
var_dump($html);
?>

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

<?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);
?>

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

<?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);
?>

四,用fsockopen函数
post

<?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;
}
?>

get

<?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;
}
?>

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

<?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;
?>

标签: none

添加新评论