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 实现多服务器共享 SESSION 数据
Aug 15 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
php命令行用法入门实例教程
Oct 27 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
PHP中串行化用法示例
Nov 16 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
php 后端实现JWT认证方法示例
Sep 04 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
MySQL修改密码方法总结
2008/03/25 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
javascript连续赋值问题
2015/07/08 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
Python实现的求解最大公约数算法示例
2018/05/03 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
python中的decimal类型转换实例详解
2019/06/26 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
部队领导证婚词
2014/01/12 职场文书
护理工作感言
2014/01/16 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
教师岗位职责范本
2015/04/02 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
2019各种承诺书范文
2019/06/24 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
我的收音机情缘
2022/04/05 无线电