PHP使用stream_context_create()模拟POST/GET请求的方法


Posted in PHP onApril 02, 2016

本文实例讲述了PHP使用stream_context_create()模拟POST/GET请求的方法。分享给大家供大家参考,具体如下:

有时候,我们需要在服务器端模拟 POST/GET 等请求,也就是在 PHP 程序中去实现模拟,改怎么做到呢?或者说,在 PHP 程序里,给你一个数组,如何将这个数组 POST/GET 到另外一个地址呢?当然,使用 CURL 很容易办到,那么如果不使用 CURL 库,又该怎么办呢?其实,在 PHP 里已经有相关的函数实现了,这个函数就是接下来要讲的 stream_context_create()。

直接 show you the code,这是最好的方法:

$data = array(
    'foo'=>'bar', 
    'baz'=>'boom', 
    'site'=>'localhost', 
    'name'=>'nowa magic'); 
$data = http_build_query($data); 
//$postdata = http_build_query($data);
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type:application/x-www-form-urlencoded',
        'content' => $data
        //'timeout' => 60 * 60 // 超时时间(单位:s)
    )
);
$url = "http://localhost/test2.php";
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;

http://localhost/test2.php 的代码为:

$data = $_POST;
echo '<pre>';
print_r( $data );
echo '</pre>';

运行结果为:

Array
(
  [foo] => bar
  [baz] => boom
  [site] => localhost
  [name] => nowa magic
)

一些要点讲解:

1. 以上程序用到了 http_build_query() 函数,如果需要了解,可以参看 前面一篇《PHP使用http_build_query()构造URL字符串的方法》。

2. stream_context_create() 是用来创建打开文件的上下文件选项的,比如用POST访问,使用代理,发送header等。就是 创建一个流,再举一个例子吧:

$context = stream_context_create(array( 
    'http' => array( 
        'method' => 'POST', 
        'header' => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)). 
        "Content-type: application/x-www-form-urlencoded\r\n", 
        'content' => http_build_query(array('status' => $message)), 
        'timeout' => 5, 
    ), 
)); 
$ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);

3. stream_context_create创建的上下文选项即可用于流(stream),也可用于文件系统(file system)。对于像 file_get_contents、file_put_contents、readfile直接使用文件名操作而没有文件句柄的函数来说更有用。stream_context_create增加header头只是一部份功能,还可以定义代理、超时等。这使得访问web的功能不弱于curl。

4. stream_context_create() 作用:创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。

5. stream_context_create 还能通过增加 timeout 选项解决file_get_contents超时处理:

$opts = array(
  'http'=>array(
  'method'=>"GET",
  'timeout'=>60,
 )
);
//创建数据流上下文
$context = stream_context_create($opts);
$html =file_get_contents('http://localhost', false, $context);
//fopen输出文件指针处的所有剩余数据:
//fpassthru($fp); //fclose()前使用

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP&amp;MYSQL服务器配置说明
Oct 09 PHP
php下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
使用PHP实现二分查找算法代码分享
Jun 24 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
PHP中的traits简单使用实例
May 13 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
Mar 21 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
May 02 PHP
Yii框架的布局文件实例分析
Sep 04 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 #PHP
PHP函数import_request_variables()用法分析
Apr 02 #PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 #PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 #PHP
PHP递归实现层级树状展开
Apr 01 #PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 #PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 #PHP
You might like
PHP开发需要注意的安全问题
2010/09/01 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
学习python处理python编码问题
2011/03/13 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
基于python实现百度翻译功能
2019/05/09 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
学历公证书范本
2014/04/09 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
实习介绍信范文
2015/05/05 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书